agentic-qe 2.1.2 → 2.2.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 +123 -0
- package/README.md +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/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/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/LearningEngine.d.ts +101 -1
- package/dist/learning/LearningEngine.d.ts.map +1 -1
- package/dist/learning/LearningEngine.js +330 -3
- package/dist/learning/LearningEngine.js.map +1 -1
- 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/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/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 +29 -0
- package/dist/learning/algorithms/index.d.ts.map +1 -0
- package/dist/learning/algorithms/index.js +44 -0
- package/dist/learning/algorithms/index.js.map +1 -0
- package/dist/learning/index.d.ts +3 -0
- package/dist/learning/index.d.ts.map +1 -1
- package/dist/learning/index.js +15 -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/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/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 +31 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +69 -0
- package/dist/providers/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PatternReplicationService - Pattern Replication with Health Monitoring
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Multi-agent pattern replication with configurable replication factor
|
|
6
|
+
* - Health monitoring for replication nodes
|
|
7
|
+
* - Conflict resolution for concurrent updates
|
|
8
|
+
* - Automatic failover and recovery
|
|
9
|
+
* - Replication consistency tracking
|
|
10
|
+
*
|
|
11
|
+
* @module memory/PatternReplicationService
|
|
12
|
+
* @version 1.0.0
|
|
13
|
+
*/
|
|
14
|
+
import { DistributedPatternLibrary } from './DistributedPatternLibrary';
|
|
15
|
+
import { TestPattern } from '../core/memory/IPatternStore';
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
/**
|
|
18
|
+
* Replication node status
|
|
19
|
+
*/
|
|
20
|
+
export declare enum ReplicationNodeStatus {
|
|
21
|
+
HEALTHY = "healthy",
|
|
22
|
+
DEGRADED = "degraded",
|
|
23
|
+
FAILED = "failed",
|
|
24
|
+
RECOVERING = "recovering"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Replication node information
|
|
28
|
+
*/
|
|
29
|
+
export interface ReplicationNode {
|
|
30
|
+
agentId: string;
|
|
31
|
+
library: DistributedPatternLibrary;
|
|
32
|
+
status: ReplicationNodeStatus;
|
|
33
|
+
lastHeartbeat: number;
|
|
34
|
+
consecutiveFailures: number;
|
|
35
|
+
totalPatterns: number;
|
|
36
|
+
lastSyncTimestamp: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Replication health metrics
|
|
40
|
+
*/
|
|
41
|
+
export interface ReplicationHealth {
|
|
42
|
+
totalNodes: number;
|
|
43
|
+
healthyNodes: number;
|
|
44
|
+
degradedNodes: number;
|
|
45
|
+
failedNodes: number;
|
|
46
|
+
recoveringNodes: number;
|
|
47
|
+
averageReplicationLag: number;
|
|
48
|
+
consistencyPercentage: number;
|
|
49
|
+
lastHealthCheck: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Replication configuration
|
|
53
|
+
*/
|
|
54
|
+
export interface ReplicationConfig {
|
|
55
|
+
/** Replication factor (number of copies) */
|
|
56
|
+
replicationFactor: number;
|
|
57
|
+
/** Heartbeat interval in milliseconds */
|
|
58
|
+
heartbeatInterval?: number;
|
|
59
|
+
/** Node failure threshold (consecutive failures) */
|
|
60
|
+
failureThreshold?: number;
|
|
61
|
+
/** Sync interval in milliseconds */
|
|
62
|
+
syncInterval?: number;
|
|
63
|
+
/** Enable automatic recovery */
|
|
64
|
+
autoRecover?: boolean;
|
|
65
|
+
/** Minimum healthy nodes required */
|
|
66
|
+
minHealthyNodes?: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Replication event types
|
|
70
|
+
*/
|
|
71
|
+
export type ReplicationEvent = {
|
|
72
|
+
type: 'pattern_replicated';
|
|
73
|
+
patternId: string;
|
|
74
|
+
nodeCount: number;
|
|
75
|
+
} | {
|
|
76
|
+
type: 'node_failed';
|
|
77
|
+
agentId: string;
|
|
78
|
+
reason: string;
|
|
79
|
+
} | {
|
|
80
|
+
type: 'node_recovered';
|
|
81
|
+
agentId: string;
|
|
82
|
+
} | {
|
|
83
|
+
type: 'sync_completed';
|
|
84
|
+
duration: number;
|
|
85
|
+
patternsReplicated: number;
|
|
86
|
+
} | {
|
|
87
|
+
type: 'inconsistency_detected';
|
|
88
|
+
patternId: string;
|
|
89
|
+
nodeIds: string[];
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* PatternReplicationService - Manages pattern replication across multiple agents
|
|
93
|
+
*
|
|
94
|
+
* This service provides:
|
|
95
|
+
* - Automatic pattern replication to N nodes (configurable replication factor)
|
|
96
|
+
* - Health monitoring with heartbeat mechanism
|
|
97
|
+
* - Automatic failover and recovery
|
|
98
|
+
* - Consistency checking and repair
|
|
99
|
+
* - Event-driven notifications for replication events
|
|
100
|
+
*/
|
|
101
|
+
export declare class PatternReplicationService extends EventEmitter {
|
|
102
|
+
private nodes;
|
|
103
|
+
private config;
|
|
104
|
+
private heartbeatTimer?;
|
|
105
|
+
private syncTimer?;
|
|
106
|
+
private isRunning;
|
|
107
|
+
private readonly DEFAULT_HEARTBEAT_INTERVAL;
|
|
108
|
+
private readonly DEFAULT_SYNC_INTERVAL;
|
|
109
|
+
private readonly DEFAULT_FAILURE_THRESHOLD;
|
|
110
|
+
constructor(config: ReplicationConfig);
|
|
111
|
+
/**
|
|
112
|
+
* Start the replication service
|
|
113
|
+
*/
|
|
114
|
+
start(): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Stop the replication service
|
|
117
|
+
*/
|
|
118
|
+
stop(): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Register a replication node
|
|
121
|
+
*/
|
|
122
|
+
registerNode(agentId: string, library: DistributedPatternLibrary): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Unregister a replication node
|
|
125
|
+
*/
|
|
126
|
+
unregisterNode(agentId: string): Promise<boolean>;
|
|
127
|
+
/**
|
|
128
|
+
* Replicate a pattern to all healthy nodes
|
|
129
|
+
*/
|
|
130
|
+
replicatePattern(pattern: TestPattern, sourceAgentId?: string): Promise<number>;
|
|
131
|
+
/**
|
|
132
|
+
* Sync patterns across all nodes
|
|
133
|
+
*/
|
|
134
|
+
syncPatterns(): Promise<{
|
|
135
|
+
synced: number;
|
|
136
|
+
duration: number;
|
|
137
|
+
}>;
|
|
138
|
+
/**
|
|
139
|
+
* Check replication health
|
|
140
|
+
*/
|
|
141
|
+
checkHealth(): Promise<ReplicationHealth>;
|
|
142
|
+
/**
|
|
143
|
+
* Get replication statistics
|
|
144
|
+
*/
|
|
145
|
+
getStats(): Promise<{
|
|
146
|
+
replicationFactor: number;
|
|
147
|
+
registeredNodes: number;
|
|
148
|
+
health: ReplicationHealth;
|
|
149
|
+
}>;
|
|
150
|
+
/**
|
|
151
|
+
* Get all registered nodes
|
|
152
|
+
*/
|
|
153
|
+
getNodes(): ReplicationNode[];
|
|
154
|
+
/**
|
|
155
|
+
* Get healthy nodes only
|
|
156
|
+
*/
|
|
157
|
+
private getHealthyNodes;
|
|
158
|
+
/**
|
|
159
|
+
* Start heartbeat monitoring
|
|
160
|
+
*/
|
|
161
|
+
private startHeartbeat;
|
|
162
|
+
/**
|
|
163
|
+
* Start periodic sync
|
|
164
|
+
*/
|
|
165
|
+
private startSync;
|
|
166
|
+
/**
|
|
167
|
+
* Perform heartbeat check on all nodes
|
|
168
|
+
*/
|
|
169
|
+
private performHeartbeat;
|
|
170
|
+
/**
|
|
171
|
+
* Handle node failure
|
|
172
|
+
*/
|
|
173
|
+
private handleNodeFailure;
|
|
174
|
+
/**
|
|
175
|
+
* Attempt to recover a failed node
|
|
176
|
+
*/
|
|
177
|
+
private attemptRecovery;
|
|
178
|
+
/**
|
|
179
|
+
* Sync a single node with the cluster
|
|
180
|
+
*/
|
|
181
|
+
private syncNode;
|
|
182
|
+
/**
|
|
183
|
+
* Calculate consistency percentage across all nodes
|
|
184
|
+
*/
|
|
185
|
+
private calculateConsistency;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=PatternReplicationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternReplicationService.d.ts","sourceRoot":"","sources":["../../src/memory/PatternReplicationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":";AAAA;;;;;;;;;;;;GAYG;;;AAIH,mCAAsC;AAEtC;;GAEG;AACH,IAAY,qBAKX;AALD,WAAY,qBAAqB;IAC/B,4CAAmB,CAAA;IACnB,8CAAqB,CAAA;IACrB,0CAAiB,CAAA;IACjB,kDAAyB,CAAA;AAC3B,CAAC,EALW,qBAAqB,qCAArB,qBAAqB,QAKhC;AAyDD;;;;;;;;;GASG;AACH,MAAa,yBAA0B,SAAQ,qBAAY;IAUzD,YAAY,MAAyB;QACnC,KAAK,EAAE,CAAC;QALO,+BAA0B,GAAG,IAAI,CAAC,CAAC,YAAY;QAC/C,0BAAqB,GAAG,KAAK,CAAC,CAAC,aAAa;QAC5C,8BAAyB,GAAG,CAAC,CAAC;QAI7C,IAAI,CAAC,MAAM,GAAG;YACZ,GAAG,MAAM;YACT,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,0BAA0B;YAC9E,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,IAAI,CAAC,yBAAyB;YAC3E,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,qBAAqB;YAC/D,WAAW,EAAE,MAAM,CAAC,WAAW,KAAK,KAAK;YACzC,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC;SACnF,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,6BAA6B;QAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,sBAAsB;QACtB,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,OAAkC;QACpE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAEvC,MAAM,IAAI,GAAoB;YAC5B,OAAO;YACP,OAAO;YACP,MAAM,EAAE,qBAAqB,CAAC,OAAO;YACrC,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,mBAAmB,EAAE,CAAC;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;SAC3C,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAE9B,6CAA6C;QAC7C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAoB,EAAE,aAAsB;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,IAAI,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,eAAgB,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,+BAA+B,YAAY,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CACtF,CAAC;QACJ,CAAC;QAED,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,MAAM,MAAM,GAA6C,EAAE,CAAC;QAE5D,gDAAgD;QAChD,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QAEzE,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,gCAAgC;YAChC,IAAI,aAAa,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBACxD,eAAe,EAAE,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC,CAAC;gBAC9D,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAc,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC9B,IAAI,EAAE,oBAAoB;YAC1B,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,SAAS,EAAE,eAAe;SACP,CAAC,CAAC;QAEvB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,eAAgB,EAAE,CAAC;YACxE,MAAM,IAAI,KAAK,CACb,oCAAoC,eAAe,0BAA0B,CAC9E,CAAC;QACJ,CAAC;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAE5C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,4CAA4C;QAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAEjE,sBAAsB;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAEnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;gBACtE,WAAW,IAAI,MAAM,CAAC;gBACtB,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,KAAc,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC1B,IAAI,EAAE,gBAAgB;YACtB,QAAQ;YACR,kBAAkB,EAAE,WAAW;SACZ,CAAC,CAAC;QAEvB,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACnD,eAAe;YACf,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;gBACzC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;YAED,kBAAkB;YAClB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,KAAK,qBAAqB,CAAC,OAAO;oBAChC,YAAY,EAAE,CAAC;oBACf,MAAM;gBACR,KAAK,qBAAqB,CAAC,QAAQ;oBACjC,aAAa,EAAE,CAAC;oBAChB,MAAM;gBACR,KAAK,qBAAqB,CAAC,MAAM;oBAC/B,WAAW,EAAE,CAAC;oBACd,MAAM;gBACR,KAAK,qBAAqB,CAAC,UAAU;oBACnC,eAAe,EAAE,CAAC;oBAClB,MAAM;YACV,CAAC;YAED,4BAA4B;YAC5B,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACzC,mBAAmB,IAAI,GAAG,CAAC;QAC7B,CAAC;QAED,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9F,mCAAmC;QACnC,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAEhE,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAC3B,YAAY,EAAE,YAAY;YAC1B,aAAa,EAAE,aAAa;YAC5B,WAAW,EAAE,WAAW;YACxB,eAAe,EAAE,eAAe;YAChC,qBAAqB;YACrB,qBAAqB;YACrB,eAAe,EAAE,GAAG;SACrB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QAKZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAExC,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAiB;YAChD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YAChC,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC3C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,CACtD,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC3C,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,iBAAkB,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,SAAS;QACf,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,YAAa,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC;gBACH,mCAAmC;gBACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;gBACzC,IAAI,CAAC,aAAa,GAAG,GAAG,CAAC;gBACzB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;gBAE7B,8BAA8B;gBAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,UAAU,EAAE,CAAC;oBACrD,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC;oBAC5C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;wBAC1B,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;qBACF,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAc,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,IAAqB,EAAE,KAAY;QACjE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAiB,EAAE,CAAC;YAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,MAAM,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;oBACvB,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,KAAK,CAAC,OAAO;iBACF,CAAC,CAAC;gBAEvB,8BAA8B;gBAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC5B,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACzD,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC;QAC/C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,IAAqB;QACjD,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC;QAE/C,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAEhC,kCAAkC;YAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAE1B,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC;YAC5C,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAE7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1B,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,IAAI,CAAC,OAAO;aACF,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,UAA2B;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QAE1F,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,gCAAgC;QAC1C,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAE3D,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjD,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,oBAAoB;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,CAAC,mCAAmC;QACjD,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,CAAC,uDAAuD;QACnE,CAAC;QAED,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QAEpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;YAE5D,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAE3C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAE7B,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,gBAAgB,GAAG,CAAC,CAAC;YAEzB,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC3D,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC9B,gBAAgB,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,IAAI,gBAAgB,KAAK,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC7C,oBAAoB,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1F,CAAC;CACF;AAhbD,8DAgbC"}
|