agentic-qe 2.2.0 → 2.2.2
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/.claude/agents/qe-security-scanner.md +26 -0
- package/.claude/skills/agentic-quality-engineering/SKILL.md +4 -4
- package/.claude/skills/cicd-pipeline-qe-orchestrator/README.md +14 -11
- package/.claude/skills/skills-manifest.json +2 -2
- package/CHANGELOG.md +75 -0
- package/README.md +92 -214
- package/dist/agents/BaseAgent.d.ts +5 -1
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +32 -17
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/index.js +3 -3
- package/dist/agents/index.js.map +1 -1
- package/dist/cli/commands/improve/index.d.ts +8 -1
- package/dist/cli/commands/improve/index.d.ts.map +1 -1
- package/dist/cli/commands/improve/index.js +18 -16
- package/dist/cli/commands/improve/index.js.map +1 -1
- package/dist/cli/commands/learn/index.d.ts +10 -2
- package/dist/cli/commands/learn/index.d.ts.map +1 -1
- package/dist/cli/commands/learn/index.js +99 -63
- package/dist/cli/commands/learn/index.js.map +1 -1
- package/dist/cli/commands/patterns/index.d.ts +8 -1
- package/dist/cli/commands/patterns/index.d.ts.map +1 -1
- package/dist/cli/commands/patterns/index.js +79 -45
- package/dist/cli/commands/patterns/index.js.map +1 -1
- package/dist/cli/commands/routing/index.d.ts +5 -0
- package/dist/cli/commands/routing/index.d.ts.map +1 -1
- package/dist/cli/commands/routing/index.js +11 -10
- package/dist/cli/commands/routing/index.js.map +1 -1
- package/dist/cli/init/agents.d.ts +1 -1
- package/dist/cli/init/agents.js +2 -2
- package/dist/cli/init/database-init.d.ts +7 -0
- package/dist/cli/init/database-init.d.ts.map +1 -1
- package/dist/cli/init/database-init.js +29 -48
- package/dist/cli/init/database-init.js.map +1 -1
- package/dist/core/memory/HNSWVectorMemory.d.ts +261 -0
- package/dist/core/memory/HNSWVectorMemory.d.ts.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +647 -0
- package/dist/core/memory/HNSWVectorMemory.js.map +1 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts +7 -0
- package/dist/core/memory/SwarmMemoryManager.d.ts.map +1 -1
- package/dist/core/memory/SwarmMemoryManager.js +9 -0
- package/dist/core/memory/SwarmMemoryManager.js.map +1 -1
- package/dist/core/memory/index.d.ts +2 -0
- package/dist/core/memory/index.d.ts.map +1 -1
- package/dist/core/memory/index.js +11 -1
- package/dist/core/memory/index.js.map +1 -1
- package/dist/learning/ExplainableLearning.d.ts +191 -0
- package/dist/learning/ExplainableLearning.d.ts.map +1 -0
- package/dist/learning/ExplainableLearning.js +441 -0
- package/dist/learning/ExplainableLearning.js.map +1 -0
- package/dist/learning/GossipPatternSharingProtocol.d.ts +228 -0
- package/dist/learning/GossipPatternSharingProtocol.d.ts.map +1 -0
- package/dist/learning/GossipPatternSharingProtocol.js +590 -0
- package/dist/learning/GossipPatternSharingProtocol.js.map +1 -0
- package/dist/learning/LearningEngine.d.ts +4 -4
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +20 -13
- package/dist/learning/LearningEngine.js.map +1 -1
- package/dist/learning/PerformanceOptimizer.d.ts +268 -0
- package/dist/learning/PerformanceOptimizer.d.ts.map +1 -0
- package/dist/learning/PerformanceOptimizer.js +552 -0
- package/dist/learning/PerformanceOptimizer.js.map +1 -0
- package/dist/learning/PrivacyManager.d.ts +197 -0
- package/dist/learning/PrivacyManager.d.ts.map +1 -0
- package/dist/learning/PrivacyManager.js +551 -0
- package/dist/learning/PrivacyManager.js.map +1 -0
- package/dist/learning/TransferLearningManager.d.ts +212 -0
- package/dist/learning/TransferLearningManager.d.ts.map +1 -0
- package/dist/learning/TransferLearningManager.js +497 -0
- package/dist/learning/TransferLearningManager.js.map +1 -0
- package/dist/learning/algorithms/MAMLMetaLearner.d.ts +218 -0
- package/dist/learning/algorithms/MAMLMetaLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/MAMLMetaLearner.js +532 -0
- package/dist/learning/algorithms/MAMLMetaLearner.js.map +1 -0
- package/dist/learning/algorithms/index.d.ts +4 -1
- package/dist/learning/algorithms/index.d.ts.map +1 -1
- package/dist/learning/algorithms/index.js +7 -1
- package/dist/learning/algorithms/index.js.map +1 -1
- package/dist/learning/index.d.ts +8 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +17 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/providers/HybridRouter.d.ts +217 -0
- package/dist/providers/HybridRouter.d.ts.map +1 -0
- package/dist/providers/HybridRouter.js +679 -0
- package/dist/providers/HybridRouter.js.map +1 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +7 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/telemetry/LearningTelemetry.d.ts +190 -0
- package/dist/telemetry/LearningTelemetry.d.ts.map +1 -0
- package/dist/telemetry/LearningTelemetry.js +403 -0
- package/dist/telemetry/LearningTelemetry.js.map +1 -0
- package/dist/telemetry/index.d.ts +1 -0
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +20 -2
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/instrumentation/agent.d.ts +1 -1
- package/dist/telemetry/instrumentation/agent.js +1 -1
- package/dist/telemetry/instrumentation/index.d.ts +1 -1
- package/dist/telemetry/instrumentation/index.js +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +16 -0
- package/dist/utils/math.js.map +1 -0
- package/docs/reference/agents.md +1 -1
- package/docs/reference/skills.md +3 -3
- package/docs/reference/usage.md +4 -4
- package/package.json +14 -1
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PrivacyManager - Privacy Controls for Learning Data
|
|
4
|
+
*
|
|
5
|
+
* Implements privacy levels and data protection for the learning system:
|
|
6
|
+
* - PUBLIC: Full sharing, all data visible
|
|
7
|
+
* - TEAM: Share within team namespace only
|
|
8
|
+
* - PRIVATE: No sharing, local learning only
|
|
9
|
+
* - PARANOID: No persistence, in-memory only, auto-wipe
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Code snippet sanitization
|
|
13
|
+
* - Agent ID anonymization for cross-team sharing
|
|
14
|
+
* - Data retention policies
|
|
15
|
+
* - Encryption for sensitive patterns
|
|
16
|
+
* - Integration with ExperienceSharingProtocol
|
|
17
|
+
*
|
|
18
|
+
* @module learning/PrivacyManager
|
|
19
|
+
* @version 1.0.0
|
|
20
|
+
*/
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.PrivacyManager = exports.PrivacyLevel = void 0;
|
|
26
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
27
|
+
const Logger_1 = require("../utils/Logger");
|
|
28
|
+
/**
|
|
29
|
+
* Privacy levels for learning data
|
|
30
|
+
*/
|
|
31
|
+
var PrivacyLevel;
|
|
32
|
+
(function (PrivacyLevel) {
|
|
33
|
+
/** Full sharing, all data visible */
|
|
34
|
+
PrivacyLevel["PUBLIC"] = "PUBLIC";
|
|
35
|
+
/** Share within team namespace only */
|
|
36
|
+
PrivacyLevel["TEAM"] = "TEAM";
|
|
37
|
+
/** No sharing, local learning only */
|
|
38
|
+
PrivacyLevel["PRIVATE"] = "PRIVATE";
|
|
39
|
+
/** No persistence, in-memory only, auto-wipe */
|
|
40
|
+
PrivacyLevel["PARANOID"] = "PARANOID";
|
|
41
|
+
})(PrivacyLevel || (exports.PrivacyLevel = PrivacyLevel = {}));
|
|
42
|
+
/**
|
|
43
|
+
* Default privacy configurations for each level
|
|
44
|
+
*/
|
|
45
|
+
const DEFAULT_PRIVACY_CONFIGS = {
|
|
46
|
+
[PrivacyLevel.PUBLIC]: {
|
|
47
|
+
retentionPeriod: 365 * 24 * 60 * 60 * 1000, // 1 year
|
|
48
|
+
sanitizeCode: false,
|
|
49
|
+
anonymizeAgentIds: false,
|
|
50
|
+
redactionPatterns: []
|
|
51
|
+
},
|
|
52
|
+
[PrivacyLevel.TEAM]: {
|
|
53
|
+
retentionPeriod: 90 * 24 * 60 * 60 * 1000, // 90 days
|
|
54
|
+
sanitizeCode: true,
|
|
55
|
+
anonymizeAgentIds: true,
|
|
56
|
+
redactionPatterns: [
|
|
57
|
+
'password\\s*=\\s*["\'].*?["\']',
|
|
58
|
+
'api[_-]?key\\s*=\\s*["\'].*?["\']',
|
|
59
|
+
'secret\\s*=\\s*["\'].*?["\']',
|
|
60
|
+
'token\\s*=\\s*["\'].*?["\']'
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
[PrivacyLevel.PRIVATE]: {
|
|
64
|
+
retentionPeriod: 30 * 24 * 60 * 60 * 1000, // 30 days
|
|
65
|
+
sanitizeCode: true,
|
|
66
|
+
anonymizeAgentIds: true,
|
|
67
|
+
redactionPatterns: [
|
|
68
|
+
'password\\s*=\\s*["\'].*?["\']',
|
|
69
|
+
'api[_-]?key\\s*=\\s*["\'].*?["\']',
|
|
70
|
+
'secret\\s*=\\s*["\'].*?["\']',
|
|
71
|
+
'token\\s*=\\s*["\'].*?["\']',
|
|
72
|
+
'\\b\\d{3}-\\d{2}-\\d{4}\\b', // SSN
|
|
73
|
+
'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b', // Email
|
|
74
|
+
'\\b(?:\\d[ -]?){13,16}\\b' // Credit card
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
[PrivacyLevel.PARANOID]: {
|
|
78
|
+
retentionPeriod: 0, // No persistence
|
|
79
|
+
sanitizeCode: true,
|
|
80
|
+
anonymizeAgentIds: true,
|
|
81
|
+
maxExperienceAge: 60 * 60 * 1000, // 1 hour max age in memory
|
|
82
|
+
redactionPatterns: [
|
|
83
|
+
// All patterns from PRIVATE plus more aggressive ones
|
|
84
|
+
'password\\s*=\\s*["\'].*?["\']',
|
|
85
|
+
'api[_-]?key\\s*=\\s*["\'].*?["\']',
|
|
86
|
+
'secret\\s*=\\s*["\'].*?["\']',
|
|
87
|
+
'token\\s*=\\s*["\'].*?["\']',
|
|
88
|
+
'\\b\\d{3}-\\d{2}-\\d{4}\\b',
|
|
89
|
+
'\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b',
|
|
90
|
+
'\\b(?:\\d[ -]?){13,16}\\b',
|
|
91
|
+
'\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b', // IP addresses
|
|
92
|
+
'\\b[a-f0-9]{32}\\b', // MD5 hashes
|
|
93
|
+
'\\b[a-f0-9]{40}\\b', // SHA1 hashes
|
|
94
|
+
'\\b[a-f0-9]{64}\\b' // SHA256 hashes
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* PrivacyManager - Manages privacy controls for learning data
|
|
100
|
+
*/
|
|
101
|
+
class PrivacyManager {
|
|
102
|
+
constructor(config) {
|
|
103
|
+
this.encryptionAlgorithm = 'aes-256-cbc';
|
|
104
|
+
this.logger = Logger_1.Logger.getInstance();
|
|
105
|
+
// Merge with defaults for the privacy level
|
|
106
|
+
const defaults = DEFAULT_PRIVACY_CONFIGS[config.level];
|
|
107
|
+
this.config = {
|
|
108
|
+
level: config.level,
|
|
109
|
+
teamNamespace: config.teamNamespace ?? '',
|
|
110
|
+
encryptionKey: config.encryptionKey ?? this.generateEncryptionKey(),
|
|
111
|
+
retentionPeriod: config.retentionPeriod ?? defaults.retentionPeriod ?? 0,
|
|
112
|
+
sanitizeCode: config.sanitizeCode ?? defaults.sanitizeCode ?? false,
|
|
113
|
+
anonymizeAgentIds: config.anonymizeAgentIds ?? defaults.anonymizeAgentIds ?? false,
|
|
114
|
+
maxExperienceAge: config.maxExperienceAge ?? defaults.maxExperienceAge ?? 0,
|
|
115
|
+
redactionPatterns: config.redactionPatterns ?? defaults.redactionPatterns ?? []
|
|
116
|
+
};
|
|
117
|
+
this.anonymizationMap = new Map();
|
|
118
|
+
// Initialize encryption key
|
|
119
|
+
if (this.config.encryptionKey) {
|
|
120
|
+
this.encryptionKey = this.deriveKey(this.config.encryptionKey);
|
|
121
|
+
}
|
|
122
|
+
// Validate configuration
|
|
123
|
+
this.validateConfig();
|
|
124
|
+
// Start cleanup timer for PARANOID mode
|
|
125
|
+
if (this.config.level === PrivacyLevel.PARANOID && this.config.maxExperienceAge > 0) {
|
|
126
|
+
this.startCleanupTimer();
|
|
127
|
+
}
|
|
128
|
+
this.logger.info(`PrivacyManager initialized with level: ${this.config.level}`);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate privacy configuration
|
|
132
|
+
*/
|
|
133
|
+
validateConfig() {
|
|
134
|
+
if (this.config.level === PrivacyLevel.TEAM && !this.config.teamNamespace) {
|
|
135
|
+
throw new Error('teamNamespace is required for TEAM privacy level');
|
|
136
|
+
}
|
|
137
|
+
if ((this.config.level === PrivacyLevel.PRIVATE || this.config.level === PrivacyLevel.PARANOID) &&
|
|
138
|
+
!this.config.encryptionKey) {
|
|
139
|
+
this.logger.warn('No encryption key provided for PRIVATE/PARANOID mode, using auto-generated key');
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generate a random encryption key
|
|
144
|
+
*/
|
|
145
|
+
generateEncryptionKey() {
|
|
146
|
+
return crypto_1.default.randomBytes(32).toString('hex');
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Derive encryption key from password
|
|
150
|
+
*/
|
|
151
|
+
deriveKey(password) {
|
|
152
|
+
return crypto_1.default.pbkdf2Sync(password, 'agentic-qe-salt', 100000, 32, 'sha256');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Get current privacy level
|
|
156
|
+
*/
|
|
157
|
+
getPrivacyLevel() {
|
|
158
|
+
return this.config.level;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check if experience sharing is allowed
|
|
162
|
+
*/
|
|
163
|
+
canShareExperiences() {
|
|
164
|
+
return this.config.level === PrivacyLevel.PUBLIC ||
|
|
165
|
+
this.config.level === PrivacyLevel.TEAM;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Check if persistence is allowed
|
|
169
|
+
*/
|
|
170
|
+
canPersist() {
|
|
171
|
+
return this.config.level !== PrivacyLevel.PARANOID;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Check if an experience can be shared with a specific agent
|
|
175
|
+
*/
|
|
176
|
+
canShareWith(targetAgentId, targetTeamNamespace) {
|
|
177
|
+
switch (this.config.level) {
|
|
178
|
+
case PrivacyLevel.PUBLIC:
|
|
179
|
+
return true;
|
|
180
|
+
case PrivacyLevel.TEAM:
|
|
181
|
+
return targetTeamNamespace === this.config.teamNamespace;
|
|
182
|
+
case PrivacyLevel.PRIVATE:
|
|
183
|
+
case PrivacyLevel.PARANOID:
|
|
184
|
+
return false;
|
|
185
|
+
default:
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Sanitize an experience based on privacy settings
|
|
191
|
+
*/
|
|
192
|
+
sanitizeExperience(experience) {
|
|
193
|
+
const redactions = [];
|
|
194
|
+
let sanitized = { ...experience };
|
|
195
|
+
let anonymized = false;
|
|
196
|
+
let encrypted = false;
|
|
197
|
+
// Anonymize agent ID if configured
|
|
198
|
+
if (this.config.anonymizeAgentIds) {
|
|
199
|
+
sanitized.agentId = this.anonymizeAgentId(experience.agentId);
|
|
200
|
+
anonymized = true;
|
|
201
|
+
redactions.push('agent_id');
|
|
202
|
+
}
|
|
203
|
+
// Sanitize code snippets in context features
|
|
204
|
+
if (this.config.sanitizeCode && sanitized.state.contextFeatures) {
|
|
205
|
+
const { sanitized: sanitizedContext, redacted } = this.sanitizeObject(sanitized.state.contextFeatures);
|
|
206
|
+
sanitized.state.contextFeatures = sanitizedContext;
|
|
207
|
+
redactions.push(...redacted);
|
|
208
|
+
}
|
|
209
|
+
// Encrypt sensitive action data for PRIVATE/PARANOID
|
|
210
|
+
if ((this.config.level === PrivacyLevel.PRIVATE || this.config.level === PrivacyLevel.PARANOID) &&
|
|
211
|
+
this.encryptionKey) {
|
|
212
|
+
sanitized.action = this.encryptActionData(sanitized.action);
|
|
213
|
+
encrypted = true;
|
|
214
|
+
redactions.push('action_encrypted');
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
original: experience,
|
|
218
|
+
sanitized,
|
|
219
|
+
redactions,
|
|
220
|
+
anonymized,
|
|
221
|
+
encrypted
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Sanitize a shared experience before sharing
|
|
226
|
+
*/
|
|
227
|
+
sanitizeSharedExperience(sharedExperience) {
|
|
228
|
+
const { sanitized } = this.sanitizeExperience(sharedExperience.experience);
|
|
229
|
+
return {
|
|
230
|
+
...sharedExperience,
|
|
231
|
+
experience: sanitized,
|
|
232
|
+
sourceAgentId: this.config.anonymizeAgentIds
|
|
233
|
+
? this.anonymizeAgentId(sharedExperience.sourceAgentId)
|
|
234
|
+
: sharedExperience.sourceAgentId
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Sanitize a learned pattern
|
|
239
|
+
*/
|
|
240
|
+
sanitizePattern(pattern) {
|
|
241
|
+
const sanitized = { ...pattern };
|
|
242
|
+
// Sanitize pattern string (may contain code)
|
|
243
|
+
if (this.config.sanitizeCode) {
|
|
244
|
+
const { sanitized: sanitizedPattern } = this.sanitizeString(pattern.pattern);
|
|
245
|
+
sanitized.pattern = sanitizedPattern;
|
|
246
|
+
}
|
|
247
|
+
// Sanitize contexts (may contain sensitive task types)
|
|
248
|
+
if (this.config.sanitizeCode && sanitized.contexts) {
|
|
249
|
+
sanitized.contexts = sanitized.contexts.map(ctx => {
|
|
250
|
+
const { sanitized: sanitizedCtx } = this.sanitizeString(ctx);
|
|
251
|
+
return sanitizedCtx;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
return sanitized;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Anonymize an agent ID
|
|
258
|
+
*/
|
|
259
|
+
anonymizeAgentId(agentId) {
|
|
260
|
+
if (!this.anonymizationMap.has(agentId)) {
|
|
261
|
+
const hash = crypto_1.default.createHash('sha256').update(agentId).digest('hex').substring(0, 16);
|
|
262
|
+
const anonymousId = `agent-${hash}`;
|
|
263
|
+
this.anonymizationMap.set(agentId, anonymousId);
|
|
264
|
+
}
|
|
265
|
+
return this.anonymizationMap.get(agentId);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* De-anonymize an agent ID (if mapping exists)
|
|
269
|
+
*/
|
|
270
|
+
deAnonymizeAgentId(anonymousId) {
|
|
271
|
+
for (const [original, anonymous] of this.anonymizationMap.entries()) {
|
|
272
|
+
if (anonymous === anonymousId) {
|
|
273
|
+
return original;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Sanitize a string by applying redaction patterns
|
|
280
|
+
*/
|
|
281
|
+
sanitizeString(input) {
|
|
282
|
+
let sanitized = input;
|
|
283
|
+
const redacted = [];
|
|
284
|
+
for (const pattern of this.config.redactionPatterns) {
|
|
285
|
+
const regex = new RegExp(pattern, 'gi');
|
|
286
|
+
const matches = sanitized.match(regex);
|
|
287
|
+
if (matches) {
|
|
288
|
+
sanitized = sanitized.replace(regex, '[REDACTED]');
|
|
289
|
+
redacted.push(`pattern_${pattern.substring(0, 20)}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return { sanitized, redacted };
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Sanitize an object recursively
|
|
296
|
+
*/
|
|
297
|
+
sanitizeObject(obj) {
|
|
298
|
+
const redacted = [];
|
|
299
|
+
if (typeof obj === 'string') {
|
|
300
|
+
const result = this.sanitizeString(obj);
|
|
301
|
+
redacted.push(...result.redacted);
|
|
302
|
+
return { sanitized: result.sanitized, redacted };
|
|
303
|
+
}
|
|
304
|
+
if (Array.isArray(obj)) {
|
|
305
|
+
const sanitized = obj.map(item => {
|
|
306
|
+
const result = this.sanitizeObject(item);
|
|
307
|
+
redacted.push(...result.redacted);
|
|
308
|
+
return result.sanitized;
|
|
309
|
+
});
|
|
310
|
+
return { sanitized, redacted };
|
|
311
|
+
}
|
|
312
|
+
if (typeof obj === 'object' && obj !== null) {
|
|
313
|
+
const sanitized = {};
|
|
314
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
315
|
+
const result = this.sanitizeObject(value);
|
|
316
|
+
sanitized[key] = result.sanitized;
|
|
317
|
+
redacted.push(...result.redacted);
|
|
318
|
+
}
|
|
319
|
+
return { sanitized, redacted };
|
|
320
|
+
}
|
|
321
|
+
return { sanitized: obj, redacted };
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Encrypt action data
|
|
325
|
+
*/
|
|
326
|
+
encryptActionData(action) {
|
|
327
|
+
if (!this.encryptionKey) {
|
|
328
|
+
return action;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const iv = crypto_1.default.randomBytes(16);
|
|
332
|
+
const cipher = crypto_1.default.createCipheriv(this.encryptionAlgorithm, this.encryptionKey, iv);
|
|
333
|
+
const encrypted = Buffer.concat([
|
|
334
|
+
cipher.update(JSON.stringify(action), 'utf8'),
|
|
335
|
+
cipher.final()
|
|
336
|
+
]);
|
|
337
|
+
return {
|
|
338
|
+
encrypted: true,
|
|
339
|
+
iv: iv.toString('hex'),
|
|
340
|
+
data: encrypted.toString('hex')
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
this.logger.warn('Failed to encrypt action data:', error);
|
|
345
|
+
return action;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Decrypt action data
|
|
350
|
+
*/
|
|
351
|
+
decryptActionData(encryptedAction) {
|
|
352
|
+
if (!encryptedAction.encrypted || !this.encryptionKey) {
|
|
353
|
+
return encryptedAction;
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
const iv = Buffer.from(encryptedAction.iv, 'hex');
|
|
357
|
+
const encryptedData = Buffer.from(encryptedAction.data, 'hex');
|
|
358
|
+
const decipher = crypto_1.default.createDecipheriv(this.encryptionAlgorithm, this.encryptionKey, iv);
|
|
359
|
+
const decrypted = Buffer.concat([
|
|
360
|
+
decipher.update(encryptedData),
|
|
361
|
+
decipher.final()
|
|
362
|
+
]);
|
|
363
|
+
return JSON.parse(decrypted.toString('utf8'));
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
this.logger.warn('Failed to decrypt action data:', error);
|
|
367
|
+
return encryptedAction;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Encrypt a pattern for storage
|
|
372
|
+
*/
|
|
373
|
+
encryptPattern(pattern) {
|
|
374
|
+
if (!this.encryptionKey ||
|
|
375
|
+
(this.config.level !== PrivacyLevel.PRIVATE && this.config.level !== PrivacyLevel.PARANOID)) {
|
|
376
|
+
return pattern;
|
|
377
|
+
}
|
|
378
|
+
try {
|
|
379
|
+
const iv = crypto_1.default.randomBytes(16);
|
|
380
|
+
const cipher = crypto_1.default.createCipheriv(this.encryptionAlgorithm, this.encryptionKey, iv);
|
|
381
|
+
const encrypted = Buffer.concat([
|
|
382
|
+
cipher.update(pattern, 'utf8'),
|
|
383
|
+
cipher.final()
|
|
384
|
+
]);
|
|
385
|
+
return `encrypted:${iv.toString('hex')}:${encrypted.toString('hex')}`;
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
this.logger.warn('Failed to encrypt pattern:', error);
|
|
389
|
+
return pattern;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Decrypt a pattern from storage
|
|
394
|
+
*/
|
|
395
|
+
decryptPattern(encryptedPattern) {
|
|
396
|
+
if (!encryptedPattern.startsWith('encrypted:') || !this.encryptionKey) {
|
|
397
|
+
return encryptedPattern;
|
|
398
|
+
}
|
|
399
|
+
try {
|
|
400
|
+
const parts = encryptedPattern.split(':');
|
|
401
|
+
if (parts.length !== 3) {
|
|
402
|
+
return encryptedPattern;
|
|
403
|
+
}
|
|
404
|
+
const iv = Buffer.from(parts[1], 'hex');
|
|
405
|
+
const encryptedData = Buffer.from(parts[2], 'hex');
|
|
406
|
+
const decipher = crypto_1.default.createDecipheriv(this.encryptionAlgorithm, this.encryptionKey, iv);
|
|
407
|
+
const decrypted = Buffer.concat([
|
|
408
|
+
decipher.update(encryptedData),
|
|
409
|
+
decipher.final()
|
|
410
|
+
]);
|
|
411
|
+
return decrypted.toString('utf8');
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
this.logger.warn('Failed to decrypt pattern:', error);
|
|
415
|
+
return encryptedPattern;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Apply data retention policy
|
|
420
|
+
*/
|
|
421
|
+
applyRetentionPolicy(timestamp) {
|
|
422
|
+
const experienceTime = timestamp instanceof Date ? timestamp.getTime() : timestamp;
|
|
423
|
+
const now = Date.now();
|
|
424
|
+
const age = now - experienceTime;
|
|
425
|
+
// PARANOID mode: check max experience age
|
|
426
|
+
if (this.config.level === PrivacyLevel.PARANOID) {
|
|
427
|
+
if (this.config.maxExperienceAge > 0 && age > this.config.maxExperienceAge) {
|
|
428
|
+
return {
|
|
429
|
+
shouldRetain: false,
|
|
430
|
+
reason: `Experience exceeds max age for PARANOID mode (${this.config.maxExperienceAge}ms)`
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
shouldRetain: true,
|
|
435
|
+
reason: 'In-memory only, auto-wipe on cleanup',
|
|
436
|
+
expiresAt: new Date(experienceTime + this.config.maxExperienceAge)
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
// No retention period means keep forever
|
|
440
|
+
if (this.config.retentionPeriod === 0) {
|
|
441
|
+
return {
|
|
442
|
+
shouldRetain: true,
|
|
443
|
+
reason: 'No retention period configured, keep forever'
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
// Check if within retention period
|
|
447
|
+
if (age <= this.config.retentionPeriod) {
|
|
448
|
+
return {
|
|
449
|
+
shouldRetain: true,
|
|
450
|
+
reason: 'Within retention period',
|
|
451
|
+
expiresAt: new Date(experienceTime + this.config.retentionPeriod)
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
return {
|
|
455
|
+
shouldRetain: false,
|
|
456
|
+
reason: `Experience older than retention period (${this.config.retentionPeriod}ms)`
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Start cleanup timer for PARANOID mode
|
|
461
|
+
*/
|
|
462
|
+
startCleanupTimer() {
|
|
463
|
+
if (this.cleanupTimer) {
|
|
464
|
+
clearInterval(this.cleanupTimer);
|
|
465
|
+
}
|
|
466
|
+
// Run cleanup every 5 minutes
|
|
467
|
+
const cleanupInterval = 5 * 60 * 1000;
|
|
468
|
+
this.cleanupTimer = setInterval(() => {
|
|
469
|
+
this.logger.debug('Running PARANOID mode cleanup');
|
|
470
|
+
// Cleanup is handled by LearningEngine based on retention policy
|
|
471
|
+
}, cleanupInterval);
|
|
472
|
+
this.logger.info(`Started PARANOID mode cleanup timer (interval: ${cleanupInterval}ms)`);
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Stop cleanup timer
|
|
476
|
+
*/
|
|
477
|
+
stopCleanupTimer() {
|
|
478
|
+
if (this.cleanupTimer) {
|
|
479
|
+
clearInterval(this.cleanupTimer);
|
|
480
|
+
this.cleanupTimer = undefined;
|
|
481
|
+
this.logger.info('Stopped PARANOID mode cleanup timer');
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Clear all anonymization mappings
|
|
486
|
+
*/
|
|
487
|
+
clearAnonymizationMappings() {
|
|
488
|
+
this.anonymizationMap.clear();
|
|
489
|
+
this.logger.info('Cleared all anonymization mappings');
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Get privacy configuration
|
|
493
|
+
*/
|
|
494
|
+
getConfig() {
|
|
495
|
+
return { ...this.config };
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* Update privacy configuration
|
|
499
|
+
*/
|
|
500
|
+
updateConfig(config) {
|
|
501
|
+
const oldLevel = this.config.level;
|
|
502
|
+
this.config = {
|
|
503
|
+
...this.config,
|
|
504
|
+
...config
|
|
505
|
+
};
|
|
506
|
+
// Update encryption key if changed
|
|
507
|
+
if (config.encryptionKey && config.encryptionKey !== this.config.encryptionKey) {
|
|
508
|
+
this.encryptionKey = this.deriveKey(config.encryptionKey);
|
|
509
|
+
}
|
|
510
|
+
// Handle privacy level changes
|
|
511
|
+
if (config.level && config.level !== oldLevel) {
|
|
512
|
+
this.logger.info(`Privacy level changed from ${oldLevel} to ${config.level}`);
|
|
513
|
+
// Start/stop cleanup timer as needed
|
|
514
|
+
if (config.level === PrivacyLevel.PARANOID && !this.cleanupTimer) {
|
|
515
|
+
this.startCleanupTimer();
|
|
516
|
+
}
|
|
517
|
+
else if (config.level !== PrivacyLevel.PARANOID && this.cleanupTimer) {
|
|
518
|
+
this.stopCleanupTimer();
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
this.validateConfig();
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Dispose of resources
|
|
525
|
+
*/
|
|
526
|
+
dispose() {
|
|
527
|
+
this.stopCleanupTimer();
|
|
528
|
+
this.clearAnonymizationMappings();
|
|
529
|
+
// Clear encryption key from memory
|
|
530
|
+
if (this.encryptionKey) {
|
|
531
|
+
this.encryptionKey.fill(0);
|
|
532
|
+
this.encryptionKey = undefined;
|
|
533
|
+
}
|
|
534
|
+
this.logger.info('PrivacyManager disposed');
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Export privacy statistics
|
|
538
|
+
*/
|
|
539
|
+
getStats() {
|
|
540
|
+
return {
|
|
541
|
+
privacyLevel: this.config.level,
|
|
542
|
+
canShare: this.canShareExperiences(),
|
|
543
|
+
canPersist: this.canPersist(),
|
|
544
|
+
retentionPeriod: this.config.retentionPeriod,
|
|
545
|
+
anonymizedAgents: this.anonymizationMap.size,
|
|
546
|
+
redactionPatterns: this.config.redactionPatterns.length
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
exports.PrivacyManager = PrivacyManager;
|
|
551
|
+
//# sourceMappingURL=PrivacyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrivacyManager.js","sourceRoot":"","sources":["../../src/learning/PrivacyManager.ts"],"names":[],"mappings":"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"}
|