agentic-qe 2.1.2 → 2.2.1
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/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 +138 -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.d.ts.map +1 -1
- package/dist/agents/index.js +5 -1
- 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/di/AgentDependencies.d.ts +127 -0
- package/dist/core/di/AgentDependencies.d.ts.map +1 -0
- package/dist/core/di/AgentDependencies.js +251 -0
- package/dist/core/di/AgentDependencies.js.map +1 -0
- package/dist/core/di/DIContainer.d.ts +149 -0
- package/dist/core/di/DIContainer.d.ts.map +1 -0
- package/dist/core/di/DIContainer.js +333 -0
- package/dist/core/di/DIContainer.js.map +1 -0
- package/dist/core/di/index.d.ts +11 -0
- package/dist/core/di/index.d.ts.map +1 -0
- package/dist/core/di/index.js +22 -0
- package/dist/core/di/index.js.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -1
- package/dist/core/index.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/ExperienceSharingProtocol.d.ts +243 -0
- package/dist/learning/ExperienceSharingProtocol.d.ts.map +1 -0
- package/dist/learning/ExperienceSharingProtocol.js +538 -0
- package/dist/learning/ExperienceSharingProtocol.js.map +1 -0
- 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 +104 -4
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +350 -16
- 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/QLearning.d.ts +38 -125
- package/dist/learning/QLearning.d.ts.map +1 -1
- package/dist/learning/QLearning.js +46 -267
- package/dist/learning/QLearning.js.map +1 -1
- package/dist/learning/QLearningLegacy.d.ts +154 -0
- package/dist/learning/QLearningLegacy.d.ts.map +1 -0
- package/dist/learning/QLearningLegacy.js +337 -0
- package/dist/learning/QLearningLegacy.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/AbstractRLLearner.d.ts +162 -0
- package/dist/learning/algorithms/AbstractRLLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/AbstractRLLearner.js +300 -0
- package/dist/learning/algorithms/AbstractRLLearner.js.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts +201 -0
- package/dist/learning/algorithms/ActorCriticLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/ActorCriticLearner.js +447 -0
- package/dist/learning/algorithms/ActorCriticLearner.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/PPOLearner.d.ts +207 -0
- package/dist/learning/algorithms/PPOLearner.d.ts.map +1 -0
- package/dist/learning/algorithms/PPOLearner.js +490 -0
- package/dist/learning/algorithms/PPOLearner.js.map +1 -0
- package/dist/learning/algorithms/QLearning.d.ts +68 -0
- package/dist/learning/algorithms/QLearning.d.ts.map +1 -0
- package/dist/learning/algorithms/QLearning.js +116 -0
- package/dist/learning/algorithms/QLearning.js.map +1 -0
- package/dist/learning/algorithms/SARSALearner.d.ts +107 -0
- package/dist/learning/algorithms/SARSALearner.d.ts.map +1 -0
- package/dist/learning/algorithms/SARSALearner.js +252 -0
- package/dist/learning/algorithms/SARSALearner.js.map +1 -0
- package/dist/learning/algorithms/index.d.ts +32 -0
- package/dist/learning/algorithms/index.d.ts.map +1 -0
- package/dist/learning/algorithms/index.js +50 -0
- package/dist/learning/algorithms/index.js.map +1 -0
- package/dist/learning/index.d.ts +11 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +31 -1
- package/dist/learning/index.js.map +1 -1
- package/dist/learning/types.d.ts +2 -0
- package/dist/learning/types.d.ts.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/memory/DistributedPatternLibrary.d.ts +159 -0
- package/dist/memory/DistributedPatternLibrary.d.ts.map +1 -0
- package/dist/memory/DistributedPatternLibrary.js +370 -0
- package/dist/memory/DistributedPatternLibrary.js.map +1 -0
- package/dist/memory/PatternQualityScorer.d.ts +169 -0
- package/dist/memory/PatternQualityScorer.d.ts.map +1 -0
- package/dist/memory/PatternQualityScorer.js +327 -0
- package/dist/memory/PatternQualityScorer.js.map +1 -0
- package/dist/memory/PatternReplicationService.d.ts +187 -0
- package/dist/memory/PatternReplicationService.d.ts.map +1 -0
- package/dist/memory/PatternReplicationService.js +392 -0
- package/dist/memory/PatternReplicationService.js.map +1 -0
- package/dist/providers/ClaudeProvider.d.ts +98 -0
- package/dist/providers/ClaudeProvider.d.ts.map +1 -0
- package/dist/providers/ClaudeProvider.js +418 -0
- package/dist/providers/ClaudeProvider.js.map +1 -0
- 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/ILLMProvider.d.ts +287 -0
- package/dist/providers/ILLMProvider.d.ts.map +1 -0
- package/dist/providers/ILLMProvider.js +33 -0
- package/dist/providers/ILLMProvider.js.map +1 -0
- package/dist/providers/LLMProviderFactory.d.ts +154 -0
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -0
- package/dist/providers/LLMProviderFactory.js +426 -0
- package/dist/providers/LLMProviderFactory.js.map +1 -0
- package/dist/providers/RuvllmProvider.d.ts +107 -0
- package/dist/providers/RuvllmProvider.d.ts.map +1 -0
- package/dist/providers/RuvllmProvider.js +417 -0
- package/dist/providers/RuvllmProvider.js.map +1 -0
- package/dist/providers/index.d.ts +32 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +75 -0
- package/dist/providers/index.js.map +1 -0
- 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 +1 -1
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* PatternReplicationService - Pattern Replication with Health Monitoring
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - Multi-agent pattern replication with configurable replication factor
|
|
7
|
+
* - Health monitoring for replication nodes
|
|
8
|
+
* - Conflict resolution for concurrent updates
|
|
9
|
+
* - Automatic failover and recovery
|
|
10
|
+
* - Replication consistency tracking
|
|
11
|
+
*
|
|
12
|
+
* @module memory/PatternReplicationService
|
|
13
|
+
* @version 1.0.0
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.PatternReplicationService = exports.ReplicationNodeStatus = void 0;
|
|
17
|
+
const events_1 = require("events");
|
|
18
|
+
/**
|
|
19
|
+
* Replication node status
|
|
20
|
+
*/
|
|
21
|
+
var ReplicationNodeStatus;
|
|
22
|
+
(function (ReplicationNodeStatus) {
|
|
23
|
+
ReplicationNodeStatus["HEALTHY"] = "healthy";
|
|
24
|
+
ReplicationNodeStatus["DEGRADED"] = "degraded";
|
|
25
|
+
ReplicationNodeStatus["FAILED"] = "failed";
|
|
26
|
+
ReplicationNodeStatus["RECOVERING"] = "recovering";
|
|
27
|
+
})(ReplicationNodeStatus || (exports.ReplicationNodeStatus = ReplicationNodeStatus = {}));
|
|
28
|
+
/**
|
|
29
|
+
* PatternReplicationService - Manages pattern replication across multiple agents
|
|
30
|
+
*
|
|
31
|
+
* This service provides:
|
|
32
|
+
* - Automatic pattern replication to N nodes (configurable replication factor)
|
|
33
|
+
* - Health monitoring with heartbeat mechanism
|
|
34
|
+
* - Automatic failover and recovery
|
|
35
|
+
* - Consistency checking and repair
|
|
36
|
+
* - Event-driven notifications for replication events
|
|
37
|
+
*/
|
|
38
|
+
class PatternReplicationService extends events_1.EventEmitter {
|
|
39
|
+
constructor(config) {
|
|
40
|
+
super();
|
|
41
|
+
this.DEFAULT_HEARTBEAT_INTERVAL = 5000; // 5 seconds
|
|
42
|
+
this.DEFAULT_SYNC_INTERVAL = 30000; // 30 seconds
|
|
43
|
+
this.DEFAULT_FAILURE_THRESHOLD = 3;
|
|
44
|
+
this.config = {
|
|
45
|
+
...config,
|
|
46
|
+
heartbeatInterval: config.heartbeatInterval || this.DEFAULT_HEARTBEAT_INTERVAL,
|
|
47
|
+
failureThreshold: config.failureThreshold || this.DEFAULT_FAILURE_THRESHOLD,
|
|
48
|
+
syncInterval: config.syncInterval || this.DEFAULT_SYNC_INTERVAL,
|
|
49
|
+
autoRecover: config.autoRecover !== false,
|
|
50
|
+
minHealthyNodes: config.minHealthyNodes || Math.ceil(config.replicationFactor / 2)
|
|
51
|
+
};
|
|
52
|
+
this.nodes = new Map();
|
|
53
|
+
this.isRunning = false;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Start the replication service
|
|
57
|
+
*/
|
|
58
|
+
async start() {
|
|
59
|
+
if (this.isRunning) {
|
|
60
|
+
throw new Error('Replication service is already running');
|
|
61
|
+
}
|
|
62
|
+
this.isRunning = true;
|
|
63
|
+
// Start heartbeat monitoring
|
|
64
|
+
this.startHeartbeat();
|
|
65
|
+
// Start periodic sync
|
|
66
|
+
this.startSync();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Stop the replication service
|
|
70
|
+
*/
|
|
71
|
+
async stop() {
|
|
72
|
+
this.isRunning = false;
|
|
73
|
+
if (this.heartbeatTimer) {
|
|
74
|
+
clearInterval(this.heartbeatTimer);
|
|
75
|
+
this.heartbeatTimer = undefined;
|
|
76
|
+
}
|
|
77
|
+
if (this.syncTimer) {
|
|
78
|
+
clearInterval(this.syncTimer);
|
|
79
|
+
this.syncTimer = undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register a replication node
|
|
84
|
+
*/
|
|
85
|
+
async registerNode(agentId, library) {
|
|
86
|
+
const stats = await library.getStats();
|
|
87
|
+
const node = {
|
|
88
|
+
agentId,
|
|
89
|
+
library,
|
|
90
|
+
status: ReplicationNodeStatus.HEALTHY,
|
|
91
|
+
lastHeartbeat: Date.now(),
|
|
92
|
+
consecutiveFailures: 0,
|
|
93
|
+
totalPatterns: stats.totalPatterns,
|
|
94
|
+
lastSyncTimestamp: stats.lastSyncTimestamp
|
|
95
|
+
};
|
|
96
|
+
this.nodes.set(agentId, node);
|
|
97
|
+
// Trigger initial sync if service is running
|
|
98
|
+
if (this.isRunning) {
|
|
99
|
+
await this.syncNode(node);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Unregister a replication node
|
|
104
|
+
*/
|
|
105
|
+
async unregisterNode(agentId) {
|
|
106
|
+
return this.nodes.delete(agentId);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Replicate a pattern to all healthy nodes
|
|
110
|
+
*/
|
|
111
|
+
async replicatePattern(pattern, sourceAgentId) {
|
|
112
|
+
const healthyNodes = this.getHealthyNodes();
|
|
113
|
+
if (healthyNodes.length < this.config.minHealthyNodes) {
|
|
114
|
+
throw new Error(`Insufficient healthy nodes: ${healthyNodes.length} < ${this.config.minHealthyNodes}`);
|
|
115
|
+
}
|
|
116
|
+
let replicatedCount = 0;
|
|
117
|
+
const errors = [];
|
|
118
|
+
// Replicate to nodes (up to replication factor)
|
|
119
|
+
const targetNodes = healthyNodes.slice(0, this.config.replicationFactor);
|
|
120
|
+
for (const node of targetNodes) {
|
|
121
|
+
// Skip source node if specified
|
|
122
|
+
if (sourceAgentId && node.agentId === sourceAgentId) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await node.library.storePattern(pattern, sourceAgentId);
|
|
127
|
+
replicatedCount++;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
errors.push({ agentId: node.agentId, error: error });
|
|
131
|
+
await this.handleNodeFailure(node, error);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Emit replication event
|
|
135
|
+
this.emit('pattern_replicated', {
|
|
136
|
+
type: 'pattern_replicated',
|
|
137
|
+
patternId: pattern.id,
|
|
138
|
+
nodeCount: replicatedCount
|
|
139
|
+
});
|
|
140
|
+
if (errors.length > 0 && replicatedCount < this.config.minHealthyNodes) {
|
|
141
|
+
throw new Error(`Pattern replication failed: only ${replicatedCount} successful replications`);
|
|
142
|
+
}
|
|
143
|
+
return replicatedCount;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Sync patterns across all nodes
|
|
147
|
+
*/
|
|
148
|
+
async syncPatterns() {
|
|
149
|
+
const startTime = Date.now();
|
|
150
|
+
let totalSynced = 0;
|
|
151
|
+
const healthyNodes = this.getHealthyNodes();
|
|
152
|
+
if (healthyNodes.length < 2) {
|
|
153
|
+
return { synced: 0, duration: 0 };
|
|
154
|
+
}
|
|
155
|
+
// Use first healthy node as source of truth
|
|
156
|
+
const sourceNode = healthyNodes[0];
|
|
157
|
+
const sourcePatterns = await sourceNode.library.exportPatterns();
|
|
158
|
+
// Sync to other nodes
|
|
159
|
+
for (let i = 1; i < healthyNodes.length; i++) {
|
|
160
|
+
const targetNode = healthyNodes[i];
|
|
161
|
+
try {
|
|
162
|
+
const synced = await targetNode.library.mergePatterns(sourcePatterns);
|
|
163
|
+
totalSynced += synced;
|
|
164
|
+
targetNode.lastSyncTimestamp = Date.now();
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
await this.handleNodeFailure(targetNode, error);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const duration = Date.now() - startTime;
|
|
171
|
+
this.emit('sync_completed', {
|
|
172
|
+
type: 'sync_completed',
|
|
173
|
+
duration,
|
|
174
|
+
patternsReplicated: totalSynced
|
|
175
|
+
});
|
|
176
|
+
return { synced: totalSynced, duration };
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Check replication health
|
|
180
|
+
*/
|
|
181
|
+
async checkHealth() {
|
|
182
|
+
let totalReplicationLag = 0;
|
|
183
|
+
let healthyCount = 0;
|
|
184
|
+
let degradedCount = 0;
|
|
185
|
+
let failedCount = 0;
|
|
186
|
+
let recoveringCount = 0;
|
|
187
|
+
const now = Date.now();
|
|
188
|
+
for (const node of Array.from(this.nodes.values())) {
|
|
189
|
+
// Update stats
|
|
190
|
+
try {
|
|
191
|
+
const stats = await node.library.getStats();
|
|
192
|
+
node.totalPatterns = stats.totalPatterns;
|
|
193
|
+
node.lastSyncTimestamp = stats.lastSyncTimestamp;
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Ignore stats errors during health check
|
|
197
|
+
}
|
|
198
|
+
// Count by status
|
|
199
|
+
switch (node.status) {
|
|
200
|
+
case ReplicationNodeStatus.HEALTHY:
|
|
201
|
+
healthyCount++;
|
|
202
|
+
break;
|
|
203
|
+
case ReplicationNodeStatus.DEGRADED:
|
|
204
|
+
degradedCount++;
|
|
205
|
+
break;
|
|
206
|
+
case ReplicationNodeStatus.FAILED:
|
|
207
|
+
failedCount++;
|
|
208
|
+
break;
|
|
209
|
+
case ReplicationNodeStatus.RECOVERING:
|
|
210
|
+
recoveringCount++;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
// Calculate replication lag
|
|
214
|
+
const lag = now - node.lastSyncTimestamp;
|
|
215
|
+
totalReplicationLag += lag;
|
|
216
|
+
}
|
|
217
|
+
const averageReplicationLag = this.nodes.size > 0 ? totalReplicationLag / this.nodes.size : 0;
|
|
218
|
+
// Calculate consistency percentage
|
|
219
|
+
const consistencyPercentage = await this.calculateConsistency();
|
|
220
|
+
return {
|
|
221
|
+
totalNodes: this.nodes.size,
|
|
222
|
+
healthyNodes: healthyCount,
|
|
223
|
+
degradedNodes: degradedCount,
|
|
224
|
+
failedNodes: failedCount,
|
|
225
|
+
recoveringNodes: recoveringCount,
|
|
226
|
+
averageReplicationLag,
|
|
227
|
+
consistencyPercentage,
|
|
228
|
+
lastHealthCheck: now
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get replication statistics
|
|
233
|
+
*/
|
|
234
|
+
async getStats() {
|
|
235
|
+
const health = await this.checkHealth();
|
|
236
|
+
return {
|
|
237
|
+
replicationFactor: this.config.replicationFactor,
|
|
238
|
+
registeredNodes: this.nodes.size,
|
|
239
|
+
health
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get all registered nodes
|
|
244
|
+
*/
|
|
245
|
+
getNodes() {
|
|
246
|
+
return Array.from(this.nodes.values());
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get healthy nodes only
|
|
250
|
+
*/
|
|
251
|
+
getHealthyNodes() {
|
|
252
|
+
return Array.from(this.nodes.values()).filter(node => node.status === ReplicationNodeStatus.HEALTHY);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Start heartbeat monitoring
|
|
256
|
+
*/
|
|
257
|
+
startHeartbeat() {
|
|
258
|
+
this.heartbeatTimer = setInterval(async () => {
|
|
259
|
+
await this.performHeartbeat();
|
|
260
|
+
}, this.config.heartbeatInterval);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Start periodic sync
|
|
264
|
+
*/
|
|
265
|
+
startSync() {
|
|
266
|
+
this.syncTimer = setInterval(async () => {
|
|
267
|
+
await this.syncPatterns();
|
|
268
|
+
}, this.config.syncInterval);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Perform heartbeat check on all nodes
|
|
272
|
+
*/
|
|
273
|
+
async performHeartbeat() {
|
|
274
|
+
const now = Date.now();
|
|
275
|
+
for (const node of Array.from(this.nodes.values())) {
|
|
276
|
+
try {
|
|
277
|
+
// Try to get stats as health check
|
|
278
|
+
const stats = await node.library.getStats();
|
|
279
|
+
node.totalPatterns = stats.totalPatterns;
|
|
280
|
+
node.lastHeartbeat = now;
|
|
281
|
+
node.consecutiveFailures = 0;
|
|
282
|
+
// Update status if recovering
|
|
283
|
+
if (node.status === ReplicationNodeStatus.RECOVERING) {
|
|
284
|
+
node.status = ReplicationNodeStatus.HEALTHY;
|
|
285
|
+
this.emit('node_recovered', {
|
|
286
|
+
type: 'node_recovered',
|
|
287
|
+
agentId: node.agentId
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
await this.handleNodeFailure(node, error);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Handle node failure
|
|
298
|
+
*/
|
|
299
|
+
async handleNodeFailure(node, error) {
|
|
300
|
+
node.consecutiveFailures++;
|
|
301
|
+
if (node.consecutiveFailures >= this.config.failureThreshold) {
|
|
302
|
+
if (node.status !== ReplicationNodeStatus.FAILED) {
|
|
303
|
+
node.status = ReplicationNodeStatus.FAILED;
|
|
304
|
+
this.emit('node_failed', {
|
|
305
|
+
type: 'node_failed',
|
|
306
|
+
agentId: node.agentId,
|
|
307
|
+
reason: error.message
|
|
308
|
+
});
|
|
309
|
+
// Attempt recovery if enabled
|
|
310
|
+
if (this.config.autoRecover) {
|
|
311
|
+
await this.attemptRecovery(node);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else if (node.status === ReplicationNodeStatus.HEALTHY) {
|
|
316
|
+
node.status = ReplicationNodeStatus.DEGRADED;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Attempt to recover a failed node
|
|
321
|
+
*/
|
|
322
|
+
async attemptRecovery(node) {
|
|
323
|
+
node.status = ReplicationNodeStatus.RECOVERING;
|
|
324
|
+
try {
|
|
325
|
+
// Reinitialize the library
|
|
326
|
+
await node.library.initialize();
|
|
327
|
+
// Sync patterns from healthy node
|
|
328
|
+
await this.syncNode(node);
|
|
329
|
+
node.status = ReplicationNodeStatus.HEALTHY;
|
|
330
|
+
node.consecutiveFailures = 0;
|
|
331
|
+
this.emit('node_recovered', {
|
|
332
|
+
type: 'node_recovered',
|
|
333
|
+
agentId: node.agentId
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
node.status = ReplicationNodeStatus.FAILED;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Sync a single node with the cluster
|
|
342
|
+
*/
|
|
343
|
+
async syncNode(targetNode) {
|
|
344
|
+
const healthyNodes = this.getHealthyNodes().filter(n => n.agentId !== targetNode.agentId);
|
|
345
|
+
if (healthyNodes.length === 0) {
|
|
346
|
+
return; // No healthy nodes to sync from
|
|
347
|
+
}
|
|
348
|
+
const sourceNode = healthyNodes[0];
|
|
349
|
+
const patterns = await sourceNode.library.exportPatterns();
|
|
350
|
+
await targetNode.library.mergePatterns(patterns);
|
|
351
|
+
targetNode.lastSyncTimestamp = Date.now();
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Calculate consistency percentage across all nodes
|
|
355
|
+
*/
|
|
356
|
+
async calculateConsistency() {
|
|
357
|
+
if (this.nodes.size < 2) {
|
|
358
|
+
return 100; // Single node is always consistent
|
|
359
|
+
}
|
|
360
|
+
const healthyNodes = this.getHealthyNodes();
|
|
361
|
+
if (healthyNodes.length < 2) {
|
|
362
|
+
return 0; // Need at least 2 healthy nodes to measure consistency
|
|
363
|
+
}
|
|
364
|
+
// Get all pattern IDs from all nodes
|
|
365
|
+
const allPatternIds = new Set();
|
|
366
|
+
const nodePatterns = new Map();
|
|
367
|
+
for (const node of healthyNodes) {
|
|
368
|
+
const patterns = await node.library.exportPatterns();
|
|
369
|
+
const patternIds = new Set(patterns.map(p => p.pattern.id));
|
|
370
|
+
nodePatterns.set(node.agentId, patternIds);
|
|
371
|
+
for (const id of Array.from(patternIds)) {
|
|
372
|
+
allPatternIds.add(id);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
// Count how many patterns are fully replicated
|
|
376
|
+
let fullyReplicatedCount = 0;
|
|
377
|
+
for (const patternId of Array.from(allPatternIds)) {
|
|
378
|
+
let replicationCount = 0;
|
|
379
|
+
for (const patternIds of Array.from(nodePatterns.values())) {
|
|
380
|
+
if (patternIds.has(patternId)) {
|
|
381
|
+
replicationCount++;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (replicationCount === healthyNodes.length) {
|
|
385
|
+
fullyReplicatedCount++;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return allPatternIds.size > 0 ? (fullyReplicatedCount / allPatternIds.size) * 100 : 100;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
exports.PatternReplicationService = PatternReplicationService;
|
|
392
|
+
//# sourceMappingURL=PatternReplicationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternReplicationService.js","sourceRoot":"","sources":["../../src/memory/PatternReplicationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeProvider - Anthropic Claude API Implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides LLM capabilities through Anthropic's Claude API with support for:
|
|
5
|
+
* - Prompt caching for cost optimization
|
|
6
|
+
* - Streaming responses
|
|
7
|
+
* - Token counting
|
|
8
|
+
* - Health checks
|
|
9
|
+
*
|
|
10
|
+
* @module providers/ClaudeProvider
|
|
11
|
+
* @version 1.0.0
|
|
12
|
+
*/
|
|
13
|
+
import { ILLMProvider, LLMProviderConfig, LLMCompletionOptions, LLMCompletionResponse, LLMStreamEvent, LLMEmbeddingOptions, LLMEmbeddingResponse, LLMTokenCountOptions, LLMHealthStatus, LLMProviderMetadata } from './ILLMProvider';
|
|
14
|
+
/**
|
|
15
|
+
* Claude-specific configuration
|
|
16
|
+
*/
|
|
17
|
+
export interface ClaudeProviderConfig extends LLMProviderConfig {
|
|
18
|
+
/** Anthropic API key (uses ANTHROPIC_API_KEY env var if not provided) */
|
|
19
|
+
apiKey?: string;
|
|
20
|
+
/** Default model to use */
|
|
21
|
+
defaultModel?: string;
|
|
22
|
+
/** Enable prompt caching */
|
|
23
|
+
enableCaching?: boolean;
|
|
24
|
+
/** Base URL for API (for testing/proxies) */
|
|
25
|
+
baseUrl?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* ClaudeProvider - Anthropic Claude API implementation of ILLMProvider
|
|
29
|
+
*
|
|
30
|
+
* This provider enables access to Claude models through the Anthropic API
|
|
31
|
+
* with full support for caching, streaming, and cost tracking.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ClaudeProvider implements ILLMProvider {
|
|
34
|
+
private readonly logger;
|
|
35
|
+
private client?;
|
|
36
|
+
private config;
|
|
37
|
+
private isInitialized;
|
|
38
|
+
private totalCost;
|
|
39
|
+
private requestCount;
|
|
40
|
+
constructor(config?: ClaudeProviderConfig);
|
|
41
|
+
/**
|
|
42
|
+
* Initialize the Claude provider
|
|
43
|
+
*/
|
|
44
|
+
initialize(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Complete a prompt
|
|
47
|
+
*/
|
|
48
|
+
complete(options: LLMCompletionOptions): Promise<LLMCompletionResponse>;
|
|
49
|
+
/**
|
|
50
|
+
* Stream a completion
|
|
51
|
+
*/
|
|
52
|
+
streamComplete(options: LLMCompletionOptions): AsyncIterableIterator<LLMStreamEvent>;
|
|
53
|
+
/**
|
|
54
|
+
* Generate embeddings (Claude doesn't natively support embeddings)
|
|
55
|
+
*/
|
|
56
|
+
embed(options: LLMEmbeddingOptions): Promise<LLMEmbeddingResponse>;
|
|
57
|
+
/**
|
|
58
|
+
* Count tokens in text
|
|
59
|
+
*/
|
|
60
|
+
countTokens(options: LLMTokenCountOptions): Promise<number>;
|
|
61
|
+
/**
|
|
62
|
+
* Health check
|
|
63
|
+
*/
|
|
64
|
+
healthCheck(): Promise<LLMHealthStatus>;
|
|
65
|
+
/**
|
|
66
|
+
* Get provider metadata
|
|
67
|
+
*/
|
|
68
|
+
getMetadata(): LLMProviderMetadata;
|
|
69
|
+
/**
|
|
70
|
+
* Shutdown the provider
|
|
71
|
+
*/
|
|
72
|
+
shutdown(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Track cost for a request
|
|
75
|
+
*/
|
|
76
|
+
trackCost(usage: LLMCompletionResponse['usage']): number;
|
|
77
|
+
/**
|
|
78
|
+
* Get total cost incurred
|
|
79
|
+
*/
|
|
80
|
+
getTotalCost(): number;
|
|
81
|
+
/**
|
|
82
|
+
* Ensure provider is initialized
|
|
83
|
+
*/
|
|
84
|
+
private ensureInitialized;
|
|
85
|
+
/**
|
|
86
|
+
* Map Anthropic stream event to LLMStreamEvent
|
|
87
|
+
*/
|
|
88
|
+
private mapStreamEvent;
|
|
89
|
+
/**
|
|
90
|
+
* Get error code from exception
|
|
91
|
+
*/
|
|
92
|
+
private getErrorCode;
|
|
93
|
+
/**
|
|
94
|
+
* Check if error is retryable
|
|
95
|
+
*/
|
|
96
|
+
private isRetryableError;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=ClaudeProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ClaudeProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EAEpB,MAAM,gBAAgB,CAAC;AAGxB;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,GAAE,oBAAyB;IAiB7C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8BjC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA+F7E;;OAEG;IACI,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,cAAc,CAAC;IA0D3F;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IASxE;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBjE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAmC7C;;OAEG;IACH,WAAW,IAAI,mBAAmB;IAuBlC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,GAAG,MAAM;IAwBxD;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO,CAAC,cAAc;IA0DtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAMzB"}
|