@trentapps/manager-protocol 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +639 -0
- package/dist/analyzers/ArchitectureDetector.d.ts +44 -0
- package/dist/analyzers/ArchitectureDetector.d.ts.map +1 -0
- package/dist/analyzers/ArchitectureDetector.js +218 -0
- package/dist/analyzers/ArchitectureDetector.js.map +1 -0
- package/dist/analyzers/CSSAnalyzer.d.ts +284 -0
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/CSSAnalyzer.js +1180 -0
- package/dist/analyzers/CSSAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +5 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +5 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/design-system/index.d.ts +6 -0
- package/dist/design-system/index.d.ts.map +1 -0
- package/dist/design-system/index.js +6 -0
- package/dist/design-system/index.js.map +1 -0
- package/dist/design-system/tokens.d.ts +106 -0
- package/dist/design-system/tokens.d.ts.map +1 -0
- package/dist/design-system/tokens.js +554 -0
- package/dist/design-system/tokens.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +506 -0
- package/dist/engine/AuditLogger.d.ts.map +1 -0
- package/dist/engine/AuditLogger.js +1491 -0
- package/dist/engine/AuditLogger.js.map +1 -0
- package/dist/engine/GitHubApprovalManager.d.ts +123 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
- package/dist/engine/GitHubApprovalManager.js +347 -0
- package/dist/engine/GitHubApprovalManager.js.map +1 -0
- package/dist/engine/GitHubClient.d.ts +183 -0
- package/dist/engine/GitHubClient.d.ts.map +1 -0
- package/dist/engine/GitHubClient.js +411 -0
- package/dist/engine/GitHubClient.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +81 -0
- package/dist/engine/RateLimiter.d.ts.map +1 -0
- package/dist/engine/RateLimiter.js +215 -0
- package/dist/engine/RateLimiter.js.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
- package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
- package/dist/engine/RuleDependencyAnalyzer.js +475 -0
- package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +176 -0
- package/dist/engine/RulesEngine.d.ts.map +1 -0
- package/dist/engine/RulesEngine.js +705 -0
- package/dist/engine/RulesEngine.js.map +1 -0
- package/dist/engine/TaskManager.d.ts +174 -0
- package/dist/engine/TaskManager.d.ts.map +1 -0
- package/dist/engine/TaskManager.js +663 -0
- package/dist/engine/TaskManager.js.map +1 -0
- package/dist/engine/index.d.ts +11 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +13 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/architecture.d.ts +9 -0
- package/dist/rules/architecture.d.ts.map +1 -0
- package/dist/rules/architecture.js +322 -0
- package/dist/rules/architecture.js.map +1 -0
- package/dist/rules/azure.d.ts +7 -0
- package/dist/rules/azure.d.ts.map +1 -0
- package/dist/rules/azure.js +136 -0
- package/dist/rules/azure.js.map +1 -0
- package/dist/rules/compliance.d.ts +9 -0
- package/dist/rules/compliance.d.ts.map +1 -0
- package/dist/rules/compliance.js +286 -0
- package/dist/rules/compliance.js.map +1 -0
- package/dist/rules/condition-optimizer.d.ts +151 -0
- package/dist/rules/condition-optimizer.d.ts.map +1 -0
- package/dist/rules/condition-optimizer.js +479 -0
- package/dist/rules/condition-optimizer.js.map +1 -0
- package/dist/rules/css.d.ts +10 -0
- package/dist/rules/css.d.ts.map +1 -0
- package/dist/rules/css.js +1777 -0
- package/dist/rules/css.js.map +1 -0
- package/dist/rules/field-standards.d.ts +1172 -0
- package/dist/rules/field-standards.d.ts.map +1 -0
- package/dist/rules/field-standards.js +908 -0
- package/dist/rules/field-standards.js.map +1 -0
- package/dist/rules/flask.d.ts +7 -0
- package/dist/rules/flask.d.ts.map +1 -0
- package/dist/rules/flask.js +142 -0
- package/dist/rules/flask.js.map +1 -0
- package/dist/rules/index.d.ts +827 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +556 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/ml-ai.d.ts +7 -0
- package/dist/rules/ml-ai.d.ts.map +1 -0
- package/dist/rules/ml-ai.js +148 -0
- package/dist/rules/ml-ai.js.map +1 -0
- package/dist/rules/operational.d.ts +9 -0
- package/dist/rules/operational.d.ts.map +1 -0
- package/dist/rules/operational.js +318 -0
- package/dist/rules/operational.js.map +1 -0
- package/dist/rules/patterns.d.ts +568 -0
- package/dist/rules/patterns.d.ts.map +1 -0
- package/dist/rules/patterns.js +1359 -0
- package/dist/rules/patterns.js.map +1 -0
- package/dist/rules/security.d.ts +9 -0
- package/dist/rules/security.d.ts.map +1 -0
- package/dist/rules/security.js +848 -0
- package/dist/rules/security.js.map +1 -0
- package/dist/rules/shared-patterns.d.ts +268 -0
- package/dist/rules/shared-patterns.d.ts.map +1 -0
- package/dist/rules/shared-patterns.js +556 -0
- package/dist/rules/shared-patterns.js.map +1 -0
- package/dist/rules/storage.d.ts +13 -0
- package/dist/rules/storage.d.ts.map +1 -0
- package/dist/rules/storage.js +672 -0
- package/dist/rules/storage.js.map +1 -0
- package/dist/rules/stripe.d.ts +7 -0
- package/dist/rules/stripe.d.ts.map +1 -0
- package/dist/rules/stripe.js +133 -0
- package/dist/rules/stripe.js.map +1 -0
- package/dist/rules/testing.d.ts +7 -0
- package/dist/rules/testing.d.ts.map +1 -0
- package/dist/rules/testing.js +135 -0
- package/dist/rules/testing.js.map +1 -0
- package/dist/rules/ux.d.ts +9 -0
- package/dist/rules/ux.d.ts.map +1 -0
- package/dist/rules/ux.js +280 -0
- package/dist/rules/ux.js.map +1 -0
- package/dist/rules/websocket.d.ts +7 -0
- package/dist/rules/websocket.d.ts.map +1 -0
- package/dist/rules/websocket.js +128 -0
- package/dist/rules/websocket.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1967 -0
- package/dist/server.js.map +1 -0
- package/dist/supervisor/AgentSupervisor.d.ts +195 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
- package/dist/supervisor/AgentSupervisor.js +569 -0
- package/dist/supervisor/AgentSupervisor.js.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts +185 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.js +729 -0
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
- package/dist/supervisor/ProjectTracker.d.ts +210 -0
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
- package/dist/supervisor/ProjectTracker.js +709 -0
- package/dist/supervisor/ProjectTracker.js.map +1 -0
- package/dist/supervisor/index.d.ts +6 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +6 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/rule-tester.d.ts +217 -0
- package/dist/testing/rule-tester.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.d.ts +57 -0
- package/dist/testing/rule-tester.examples.d.ts.map +1 -0
- package/dist/testing/rule-tester.examples.js +375 -0
- package/dist/testing/rule-tester.examples.js.map +1 -0
- package/dist/testing/rule-tester.js +381 -0
- package/dist/testing/rule-tester.js.map +1 -0
- package/dist/testing/rule-validator.d.ts +141 -0
- package/dist/testing/rule-validator.d.ts.map +1 -0
- package/dist/testing/rule-validator.js +640 -0
- package/dist/testing/rule-validator.js.map +1 -0
- package/dist/types/index.d.ts +1282 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +386 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +86 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +171 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/rate-limiting.d.ts +268 -0
- package/dist/utils/rate-limiting.d.ts.map +1 -0
- package/dist/utils/rate-limiting.js +403 -0
- package/dist/utils/rate-limiting.js.map +1 -0
- package/dist/utils/shared.d.ts +306 -0
- package/dist/utils/shared.d.ts.map +1 -0
- package/dist/utils/shared.js +464 -0
- package/dist/utils/shared.js.map +1 -0
- package/dist/utils/shell.d.ts +22 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Dependency Analyzer (Task #37)
|
|
3
|
+
*
|
|
4
|
+
* Analyzes and validates rule interdependencies, detects circular dependencies,
|
|
5
|
+
* and provides topologically sorted execution order.
|
|
6
|
+
*/
|
|
7
|
+
const DEFAULT_OPTIONS = {
|
|
8
|
+
maxDepthWarning: 5,
|
|
9
|
+
includeDisabled: true
|
|
10
|
+
};
|
|
11
|
+
export class RuleDependencyAnalyzer {
|
|
12
|
+
options;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build a complete dependency graph from a set of rules
|
|
18
|
+
*/
|
|
19
|
+
analyzeDependencies(rules) {
|
|
20
|
+
const ruleMap = new Map();
|
|
21
|
+
const nodes = {};
|
|
22
|
+
// First pass: create rule map and initialize nodes
|
|
23
|
+
for (const rule of rules) {
|
|
24
|
+
ruleMap.set(rule.id, rule);
|
|
25
|
+
nodes[rule.id] = {
|
|
26
|
+
ruleId: rule.id,
|
|
27
|
+
ruleName: rule.name,
|
|
28
|
+
dependencies: rule.dependsOn || [],
|
|
29
|
+
dependents: [],
|
|
30
|
+
conflicts: rule.conflictsWith || [],
|
|
31
|
+
related: rule.relatedRules || [],
|
|
32
|
+
depth: 0
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Second pass: build reverse dependency map (dependents)
|
|
36
|
+
for (const rule of rules) {
|
|
37
|
+
if (rule.dependsOn) {
|
|
38
|
+
for (const depId of rule.dependsOn) {
|
|
39
|
+
if (nodes[depId]) {
|
|
40
|
+
nodes[depId].dependents.push(rule.id);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Calculate depths
|
|
46
|
+
this.calculateDepths(nodes, ruleMap);
|
|
47
|
+
// Find circular dependencies
|
|
48
|
+
const circularPaths = this.findCircularDependencies(rules);
|
|
49
|
+
// Detect conflicts between active rules
|
|
50
|
+
const conflicts = this.detectActiveConflicts(rules);
|
|
51
|
+
// Find orphaned dependencies (dependencies that don't exist)
|
|
52
|
+
const orphanedDependencies = this.findOrphanedDependencies(rules, ruleMap);
|
|
53
|
+
// Get execution order via topological sort
|
|
54
|
+
const executionOrder = circularPaths.length === 0
|
|
55
|
+
? this.getExecutionOrder(rules)
|
|
56
|
+
: []; // Can't provide execution order with circular deps
|
|
57
|
+
return {
|
|
58
|
+
nodes,
|
|
59
|
+
executionOrder,
|
|
60
|
+
hasCircularDependencies: circularPaths.length > 0,
|
|
61
|
+
circularPaths,
|
|
62
|
+
conflicts,
|
|
63
|
+
orphanedDependencies,
|
|
64
|
+
analyzedAt: new Date().toISOString()
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Find all circular dependencies in the rule set
|
|
69
|
+
*/
|
|
70
|
+
findCircularDependencies(rules) {
|
|
71
|
+
const ruleMap = new Map();
|
|
72
|
+
for (const rule of rules) {
|
|
73
|
+
ruleMap.set(rule.id, rule);
|
|
74
|
+
}
|
|
75
|
+
const visited = new Set();
|
|
76
|
+
const recursionStack = new Set();
|
|
77
|
+
const circularPaths = [];
|
|
78
|
+
const dfs = (ruleId, path) => {
|
|
79
|
+
if (recursionStack.has(ruleId)) {
|
|
80
|
+
// Found a cycle - extract it from the path
|
|
81
|
+
const cycleStart = path.indexOf(ruleId);
|
|
82
|
+
const cycle = path.slice(cycleStart);
|
|
83
|
+
cycle.push(ruleId); // Complete the cycle
|
|
84
|
+
circularPaths.push(cycle);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (visited.has(ruleId)) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
visited.add(ruleId);
|
|
91
|
+
recursionStack.add(ruleId);
|
|
92
|
+
path.push(ruleId);
|
|
93
|
+
const rule = ruleMap.get(ruleId);
|
|
94
|
+
if (rule?.dependsOn) {
|
|
95
|
+
for (const depId of rule.dependsOn) {
|
|
96
|
+
dfs(depId, [...path]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
recursionStack.delete(ruleId);
|
|
100
|
+
};
|
|
101
|
+
for (const rule of rules) {
|
|
102
|
+
if (!visited.has(rule.id)) {
|
|
103
|
+
dfs(rule.id, []);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return circularPaths;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get topologically sorted execution order for rules
|
|
110
|
+
* Rules with dependencies come after their dependencies
|
|
111
|
+
*/
|
|
112
|
+
getExecutionOrder(rules) {
|
|
113
|
+
const ruleMap = new Map();
|
|
114
|
+
for (const rule of rules) {
|
|
115
|
+
ruleMap.set(rule.id, rule);
|
|
116
|
+
}
|
|
117
|
+
// Filter to enabled rules only (unless includeDisabled is true)
|
|
118
|
+
const activeRules = this.options.includeDisabled
|
|
119
|
+
? rules
|
|
120
|
+
: rules.filter(r => r.enabled);
|
|
121
|
+
// Kahn's algorithm for topological sort
|
|
122
|
+
const inDegree = new Map();
|
|
123
|
+
const adjacency = new Map();
|
|
124
|
+
// Initialize
|
|
125
|
+
for (const rule of activeRules) {
|
|
126
|
+
inDegree.set(rule.id, 0);
|
|
127
|
+
adjacency.set(rule.id, []);
|
|
128
|
+
}
|
|
129
|
+
// Build adjacency and in-degree
|
|
130
|
+
for (const rule of activeRules) {
|
|
131
|
+
if (rule.dependsOn) {
|
|
132
|
+
for (const depId of rule.dependsOn) {
|
|
133
|
+
// Only count dependencies that exist in the rule set
|
|
134
|
+
if (ruleMap.has(depId)) {
|
|
135
|
+
const adj = adjacency.get(depId) || [];
|
|
136
|
+
adj.push(rule.id);
|
|
137
|
+
adjacency.set(depId, adj);
|
|
138
|
+
inDegree.set(rule.id, (inDegree.get(rule.id) || 0) + 1);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Queue rules with no dependencies (in-degree 0)
|
|
144
|
+
const queue = [];
|
|
145
|
+
for (const [ruleId, degree] of inDegree) {
|
|
146
|
+
if (degree === 0) {
|
|
147
|
+
queue.push(ruleId);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Sort by priority within the same dependency level
|
|
151
|
+
queue.sort((a, b) => {
|
|
152
|
+
const ruleA = ruleMap.get(a);
|
|
153
|
+
const ruleB = ruleMap.get(b);
|
|
154
|
+
return (ruleB?.priority || 500) - (ruleA?.priority || 500);
|
|
155
|
+
});
|
|
156
|
+
const result = [];
|
|
157
|
+
while (queue.length > 0) {
|
|
158
|
+
const ruleId = queue.shift();
|
|
159
|
+
result.push(ruleId);
|
|
160
|
+
const dependents = adjacency.get(ruleId) || [];
|
|
161
|
+
const nextLevel = [];
|
|
162
|
+
for (const depId of dependents) {
|
|
163
|
+
const newDegree = (inDegree.get(depId) || 0) - 1;
|
|
164
|
+
inDegree.set(depId, newDegree);
|
|
165
|
+
if (newDegree === 0) {
|
|
166
|
+
nextLevel.push(depId);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Sort next level by priority
|
|
170
|
+
nextLevel.sort((a, b) => {
|
|
171
|
+
const ruleA = ruleMap.get(a);
|
|
172
|
+
const ruleB = ruleMap.get(b);
|
|
173
|
+
return (ruleB?.priority || 500) - (ruleA?.priority || 500);
|
|
174
|
+
});
|
|
175
|
+
queue.push(...nextLevel);
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Validate all dependencies in the rule set
|
|
181
|
+
*/
|
|
182
|
+
validateDependencies(rules) {
|
|
183
|
+
const ruleMap = new Map();
|
|
184
|
+
for (const rule of rules) {
|
|
185
|
+
ruleMap.set(rule.id, rule);
|
|
186
|
+
}
|
|
187
|
+
const errors = [];
|
|
188
|
+
const warnings = [];
|
|
189
|
+
// Check for missing dependencies
|
|
190
|
+
for (const rule of rules) {
|
|
191
|
+
if (rule.dependsOn) {
|
|
192
|
+
for (const depId of rule.dependsOn) {
|
|
193
|
+
// Self-dependency check
|
|
194
|
+
if (depId === rule.id) {
|
|
195
|
+
errors.push({
|
|
196
|
+
type: 'self_dependency',
|
|
197
|
+
ruleId: rule.id,
|
|
198
|
+
message: `Rule '${rule.name}' depends on itself`,
|
|
199
|
+
details: { dependencyId: depId }
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Missing dependency check
|
|
203
|
+
else if (!ruleMap.has(depId)) {
|
|
204
|
+
errors.push({
|
|
205
|
+
type: 'missing_dependency',
|
|
206
|
+
ruleId: rule.id,
|
|
207
|
+
message: `Rule '${rule.name}' depends on non-existent rule '${depId}'`,
|
|
208
|
+
details: { missingDependency: depId }
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
// Disabled dependency warning
|
|
212
|
+
else {
|
|
213
|
+
const depRule = ruleMap.get(depId);
|
|
214
|
+
if (!depRule.enabled && rule.enabled) {
|
|
215
|
+
warnings.push({
|
|
216
|
+
type: 'disabled_dependency',
|
|
217
|
+
ruleId: rule.id,
|
|
218
|
+
message: `Enabled rule '${rule.name}' depends on disabled rule '${depRule.name}'`,
|
|
219
|
+
details: { disabledDependency: depId }
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Check for conflicts with active rules
|
|
226
|
+
if (rule.conflictsWith && rule.enabled) {
|
|
227
|
+
for (const conflictId of rule.conflictsWith) {
|
|
228
|
+
const conflictRule = ruleMap.get(conflictId);
|
|
229
|
+
if (conflictRule?.enabled) {
|
|
230
|
+
errors.push({
|
|
231
|
+
type: 'conflict',
|
|
232
|
+
ruleId: rule.id,
|
|
233
|
+
message: `Rule '${rule.name}' conflicts with active rule '${conflictRule.name}'`,
|
|
234
|
+
details: { conflictingRule: conflictId }
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Check for circular dependencies
|
|
241
|
+
const circularPaths = this.findCircularDependencies(rules);
|
|
242
|
+
for (const path of circularPaths) {
|
|
243
|
+
errors.push({
|
|
244
|
+
type: 'circular_dependency',
|
|
245
|
+
ruleId: path[0],
|
|
246
|
+
message: `Circular dependency detected: ${path.join(' -> ')}`,
|
|
247
|
+
details: { path }
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
// Check for deep dependency chains
|
|
251
|
+
const graph = this.analyzeDependencies(rules);
|
|
252
|
+
for (const [ruleId, node] of Object.entries(graph.nodes)) {
|
|
253
|
+
if (node.depth > (this.options.maxDepthWarning || 5)) {
|
|
254
|
+
const rule = ruleMap.get(ruleId);
|
|
255
|
+
warnings.push({
|
|
256
|
+
type: 'deep_dependency_chain',
|
|
257
|
+
ruleId,
|
|
258
|
+
message: `Rule '${rule?.name}' has a deep dependency chain (depth: ${node.depth})`,
|
|
259
|
+
details: { depth: node.depth }
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Check for unused dependencies (rules that nothing depends on)
|
|
264
|
+
// This is informational, not necessarily a problem
|
|
265
|
+
const dependedOn = new Set();
|
|
266
|
+
for (const rule of rules) {
|
|
267
|
+
if (rule.dependsOn) {
|
|
268
|
+
for (const depId of rule.dependsOn) {
|
|
269
|
+
dependedOn.add(depId);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return {
|
|
274
|
+
valid: errors.length === 0,
|
|
275
|
+
errors,
|
|
276
|
+
warnings,
|
|
277
|
+
validatedAt: new Date().toISOString()
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Get rules that depend on a specific rule (direct dependents)
|
|
282
|
+
*/
|
|
283
|
+
getDependents(ruleId, rules) {
|
|
284
|
+
return rules.filter(rule => rule.dependsOn?.includes(ruleId));
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Get all rules that a specific rule depends on (direct dependencies)
|
|
288
|
+
*/
|
|
289
|
+
getDependencies(ruleId, rules) {
|
|
290
|
+
const rule = rules.find(r => r.id === ruleId);
|
|
291
|
+
if (!rule?.dependsOn) {
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
const ruleMap = new Map();
|
|
295
|
+
for (const r of rules) {
|
|
296
|
+
ruleMap.set(r.id, r);
|
|
297
|
+
}
|
|
298
|
+
return rule.dependsOn
|
|
299
|
+
.map(depId => ruleMap.get(depId))
|
|
300
|
+
.filter((r) => r !== undefined);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Get all transitive dependencies for a rule
|
|
304
|
+
*/
|
|
305
|
+
getTransitiveDependencies(ruleId, rules) {
|
|
306
|
+
const ruleMap = new Map();
|
|
307
|
+
for (const rule of rules) {
|
|
308
|
+
ruleMap.set(rule.id, rule);
|
|
309
|
+
}
|
|
310
|
+
const result = new Set();
|
|
311
|
+
const queue = [ruleId];
|
|
312
|
+
const visited = new Set();
|
|
313
|
+
while (queue.length > 0) {
|
|
314
|
+
const currentId = queue.shift();
|
|
315
|
+
if (visited.has(currentId)) {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
visited.add(currentId);
|
|
319
|
+
const currentRule = ruleMap.get(currentId);
|
|
320
|
+
if (currentRule?.dependsOn) {
|
|
321
|
+
for (const depId of currentRule.dependsOn) {
|
|
322
|
+
if (depId !== ruleId) { // Don't include the original rule
|
|
323
|
+
result.add(depId);
|
|
324
|
+
queue.push(depId);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return Array.from(result)
|
|
330
|
+
.map(id => ruleMap.get(id))
|
|
331
|
+
.filter((r) => r !== undefined);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Get all rules that would be affected if a rule is disabled
|
|
335
|
+
*/
|
|
336
|
+
getAffectedByDisabling(ruleId, rules) {
|
|
337
|
+
const ruleMap = new Map();
|
|
338
|
+
for (const rule of rules) {
|
|
339
|
+
ruleMap.set(rule.id, rule);
|
|
340
|
+
}
|
|
341
|
+
const result = new Set();
|
|
342
|
+
const queue = [ruleId];
|
|
343
|
+
const visited = new Set();
|
|
344
|
+
while (queue.length > 0) {
|
|
345
|
+
const currentId = queue.shift();
|
|
346
|
+
if (visited.has(currentId)) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
visited.add(currentId);
|
|
350
|
+
// Find rules that depend on this rule
|
|
351
|
+
for (const rule of rules) {
|
|
352
|
+
if (rule.dependsOn?.includes(currentId) && rule.id !== ruleId) {
|
|
353
|
+
result.add(rule.id);
|
|
354
|
+
queue.push(rule.id);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return Array.from(result)
|
|
359
|
+
.map(id => ruleMap.get(id))
|
|
360
|
+
.filter((r) => r !== undefined);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Get rules sorted by execution order respecting dependencies
|
|
364
|
+
* This integrates with the RulesEngine for proper evaluation order
|
|
365
|
+
*/
|
|
366
|
+
getSortedRulesForExecution(rules) {
|
|
367
|
+
// First validate - if there are circular deps, fall back to priority sort
|
|
368
|
+
const validation = this.validateDependencies(rules);
|
|
369
|
+
const hasCircular = validation.errors.some(e => e.type === 'circular_dependency');
|
|
370
|
+
if (hasCircular) {
|
|
371
|
+
console.warn('Circular dependencies detected, falling back to priority-based ordering');
|
|
372
|
+
return [...rules].sort((a, b) => (b.priority || 500) - (a.priority || 500));
|
|
373
|
+
}
|
|
374
|
+
const executionOrder = this.getExecutionOrder(rules);
|
|
375
|
+
const ruleMap = new Map();
|
|
376
|
+
for (const rule of rules) {
|
|
377
|
+
ruleMap.set(rule.id, rule);
|
|
378
|
+
}
|
|
379
|
+
// Get rules in execution order
|
|
380
|
+
const orderedRules = executionOrder
|
|
381
|
+
.map(id => ruleMap.get(id))
|
|
382
|
+
.filter((r) => r !== undefined);
|
|
383
|
+
// Add any rules not in execution order (shouldn't happen, but safety)
|
|
384
|
+
const orderedIds = new Set(executionOrder);
|
|
385
|
+
const remainingRules = rules.filter(r => !orderedIds.has(r.id));
|
|
386
|
+
return [...orderedRules, ...remainingRules];
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Calculate depth for each node in the dependency graph
|
|
390
|
+
*/
|
|
391
|
+
calculateDepths(nodes, ruleMap) {
|
|
392
|
+
const visited = new Set();
|
|
393
|
+
const calculated = new Set();
|
|
394
|
+
const calculateDepth = (ruleId) => {
|
|
395
|
+
if (calculated.has(ruleId)) {
|
|
396
|
+
return nodes[ruleId]?.depth || 0;
|
|
397
|
+
}
|
|
398
|
+
if (visited.has(ruleId)) {
|
|
399
|
+
// Circular dependency - return 0 to avoid infinite recursion
|
|
400
|
+
return 0;
|
|
401
|
+
}
|
|
402
|
+
visited.add(ruleId);
|
|
403
|
+
const node = nodes[ruleId];
|
|
404
|
+
if (!node || node.dependencies.length === 0) {
|
|
405
|
+
if (node) {
|
|
406
|
+
node.depth = 0;
|
|
407
|
+
calculated.add(ruleId);
|
|
408
|
+
}
|
|
409
|
+
return 0;
|
|
410
|
+
}
|
|
411
|
+
let maxDepth = 0;
|
|
412
|
+
for (const depId of node.dependencies) {
|
|
413
|
+
if (ruleMap.has(depId)) {
|
|
414
|
+
const depDepth = calculateDepth(depId);
|
|
415
|
+
maxDepth = Math.max(maxDepth, depDepth + 1);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
node.depth = maxDepth;
|
|
419
|
+
calculated.add(ruleId);
|
|
420
|
+
return maxDepth;
|
|
421
|
+
};
|
|
422
|
+
for (const ruleId of Object.keys(nodes)) {
|
|
423
|
+
calculateDepth(ruleId);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Detect conflicts between currently active rules
|
|
428
|
+
*/
|
|
429
|
+
detectActiveConflicts(rules) {
|
|
430
|
+
const conflicts = [];
|
|
431
|
+
const activeRules = rules.filter(r => r.enabled);
|
|
432
|
+
for (const rule of activeRules) {
|
|
433
|
+
if (rule.conflictsWith) {
|
|
434
|
+
for (const conflictId of rule.conflictsWith) {
|
|
435
|
+
const conflictRule = activeRules.find(r => r.id === conflictId);
|
|
436
|
+
if (conflictRule) {
|
|
437
|
+
// Avoid duplicate conflict entries (A conflicts B = B conflicts A)
|
|
438
|
+
const exists = conflicts.some(c => (c.ruleA === rule.id && c.ruleB === conflictId) ||
|
|
439
|
+
(c.ruleA === conflictId && c.ruleB === rule.id));
|
|
440
|
+
if (!exists) {
|
|
441
|
+
conflicts.push({
|
|
442
|
+
ruleA: rule.id,
|
|
443
|
+
ruleB: conflictId,
|
|
444
|
+
reason: `Rule '${rule.name}' explicitly conflicts with '${conflictRule.name}'`
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return conflicts;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Find dependencies that reference non-existent rules
|
|
455
|
+
*/
|
|
456
|
+
findOrphanedDependencies(rules, ruleMap) {
|
|
457
|
+
const orphaned = [];
|
|
458
|
+
for (const rule of rules) {
|
|
459
|
+
if (rule.dependsOn) {
|
|
460
|
+
for (const depId of rule.dependsOn) {
|
|
461
|
+
if (!ruleMap.has(depId)) {
|
|
462
|
+
orphaned.push({
|
|
463
|
+
ruleId: rule.id,
|
|
464
|
+
missingDependency: depId
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return orphaned;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// Export singleton instance with default options
|
|
474
|
+
export const ruleDependencyAnalyzer = new RuleDependencyAnalyzer();
|
|
475
|
+
//# sourceMappingURL=RuleDependencyAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RuleDependencyAnalyzer.js","sourceRoot":"","sources":["../../src/engine/RuleDependencyAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rules Engine Core
|
|
3
|
+
*
|
|
4
|
+
* The heart of the governance system that evaluates actions against business rules.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentAction, BusinessRule, BusinessContext, RuleCondition, EvaluationResult, BusinessRulesResult, DependencyValidationResult } from '../types/index.js';
|
|
7
|
+
import { RuleDependencyAnalyzer } from './RuleDependencyAnalyzer.js';
|
|
8
|
+
export declare class RulesEngine {
|
|
9
|
+
private rules;
|
|
10
|
+
private customEvaluators;
|
|
11
|
+
private evaluatorCache;
|
|
12
|
+
private regexCache;
|
|
13
|
+
private inOperatorSetCache;
|
|
14
|
+
private dependencyAnalyzer;
|
|
15
|
+
private executionOrderCache;
|
|
16
|
+
private respectDependencies;
|
|
17
|
+
constructor(options?: {
|
|
18
|
+
respectDependencies?: boolean;
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Register a business rule
|
|
22
|
+
* Task #53: Clear evaluator cache when rules change to ensure fresh compilation
|
|
23
|
+
*/
|
|
24
|
+
registerRule(rule: BusinessRule): void;
|
|
25
|
+
/**
|
|
26
|
+
* Register multiple business rules
|
|
27
|
+
*/
|
|
28
|
+
registerRules(rules: BusinessRule[]): void;
|
|
29
|
+
/**
|
|
30
|
+
* Unregister a rule by ID
|
|
31
|
+
* Task #53: Clear evaluator cache when rules change
|
|
32
|
+
*/
|
|
33
|
+
unregisterRule(ruleId: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Task #53: Clear the evaluator cache
|
|
36
|
+
* Task #34: Also clear regex and 'in' operator caches
|
|
37
|
+
* Task #37: Also clear execution order cache
|
|
38
|
+
* Called when rules are modified to ensure fresh compilation
|
|
39
|
+
*/
|
|
40
|
+
private clearEvaluatorCache;
|
|
41
|
+
/**
|
|
42
|
+
* Get all registered rules
|
|
43
|
+
*/
|
|
44
|
+
getRules(): BusinessRule[];
|
|
45
|
+
/**
|
|
46
|
+
* Get enabled rules sorted by priority (higher priority first)
|
|
47
|
+
* Task #39: In strict mode, filters out deprecated rules
|
|
48
|
+
* Task #37: When respectDependencies is true, returns rules in dependency-aware order
|
|
49
|
+
*/
|
|
50
|
+
getActiveRules(strictMode?: boolean): BusinessRule[];
|
|
51
|
+
/**
|
|
52
|
+
* Task #37: Get rules sorted by dependency order (dependencies first, then by priority)
|
|
53
|
+
*/
|
|
54
|
+
private getDependencySortedRules;
|
|
55
|
+
/**
|
|
56
|
+
* Task #39: Get all deprecated rules
|
|
57
|
+
*/
|
|
58
|
+
getDeprecatedRules(): BusinessRule[];
|
|
59
|
+
/**
|
|
60
|
+
* Task #39: Analyze rules and suggest migrations for deprecated rules
|
|
61
|
+
* Returns migration suggestions with replacement rule information
|
|
62
|
+
*/
|
|
63
|
+
migrateRules(rules: BusinessRule[]): Array<{
|
|
64
|
+
ruleId: string;
|
|
65
|
+
ruleName: string;
|
|
66
|
+
deprecatedMessage?: string;
|
|
67
|
+
replacedBy?: string;
|
|
68
|
+
replacementRule?: BusinessRule;
|
|
69
|
+
suggestion: string;
|
|
70
|
+
}>;
|
|
71
|
+
/**
|
|
72
|
+
* Task #39: Check if a rule is compatible with the current supervisor version
|
|
73
|
+
*/
|
|
74
|
+
isRuleCompatible(rule: BusinessRule, currentVersion: string): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Task #37: Validate all rule dependencies
|
|
77
|
+
* Returns validation result with errors and warnings
|
|
78
|
+
*/
|
|
79
|
+
validateDependencies(): DependencyValidationResult;
|
|
80
|
+
/**
|
|
81
|
+
* Task #37: Get the dependency analyzer for advanced analysis
|
|
82
|
+
*/
|
|
83
|
+
getDependencyAnalyzer(): RuleDependencyAnalyzer;
|
|
84
|
+
/**
|
|
85
|
+
* Task #37: Enable or disable dependency-aware rule ordering
|
|
86
|
+
*/
|
|
87
|
+
setRespectDependencies(enabled: boolean): void;
|
|
88
|
+
/**
|
|
89
|
+
* Task #37: Check if dependency-aware ordering is enabled
|
|
90
|
+
*/
|
|
91
|
+
isRespectingDependencies(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Task #37: Get rules that depend on a specific rule
|
|
94
|
+
*/
|
|
95
|
+
getRuleDependents(ruleId: string): BusinessRule[];
|
|
96
|
+
/**
|
|
97
|
+
* Task #37: Get rules that a specific rule depends on
|
|
98
|
+
*/
|
|
99
|
+
getRuleDependencies(ruleId: string): BusinessRule[];
|
|
100
|
+
/**
|
|
101
|
+
* Task #37: Get all rules that would be affected if a rule is disabled
|
|
102
|
+
*/
|
|
103
|
+
getRulesAffectedByDisabling(ruleId: string): BusinessRule[];
|
|
104
|
+
/**
|
|
105
|
+
* Task #39: Compare semantic versions
|
|
106
|
+
* Returns: 1 if a > b, -1 if a < b, 0 if equal
|
|
107
|
+
*/
|
|
108
|
+
private compareVersions;
|
|
109
|
+
/**
|
|
110
|
+
* Task #39: Warn about deprecated rule usage
|
|
111
|
+
*/
|
|
112
|
+
private warnDeprecatedRule;
|
|
113
|
+
/**
|
|
114
|
+
* Register a custom condition evaluator
|
|
115
|
+
* Task #53: Clear evaluator cache when custom evaluators change
|
|
116
|
+
*/
|
|
117
|
+
registerCustomEvaluator(name: string, evaluator: (context: Record<string, unknown>, condition: RuleCondition) => boolean): void;
|
|
118
|
+
/**
|
|
119
|
+
* Evaluate an agent action against all active rules
|
|
120
|
+
*/
|
|
121
|
+
evaluateAction(action: AgentAction, context?: BusinessContext): EvaluationResult;
|
|
122
|
+
/**
|
|
123
|
+
* Apply business rules to a context and return recommendations
|
|
124
|
+
*/
|
|
125
|
+
applyBusinessRules(context: BusinessContext): BusinessRulesResult;
|
|
126
|
+
/**
|
|
127
|
+
* Build evaluation context from action and business context
|
|
128
|
+
*/
|
|
129
|
+
private buildEvaluationContext;
|
|
130
|
+
/**
|
|
131
|
+
* Task #34: Sort conditions by evaluation cost for optimal short-circuit evaluation
|
|
132
|
+
* Cheaper operations (exists, equals) go first, expensive ones (regex, custom) last
|
|
133
|
+
*/
|
|
134
|
+
private sortConditionsByEvaluationCost;
|
|
135
|
+
/**
|
|
136
|
+
* Evaluate if all/any conditions of a rule match
|
|
137
|
+
* Task #34: Optimized with condition sorting for short-circuit evaluation
|
|
138
|
+
*/
|
|
139
|
+
private evaluateRuleConditions;
|
|
140
|
+
/**
|
|
141
|
+
* Task #34: Get cached RegExp or compile and cache it
|
|
142
|
+
*/
|
|
143
|
+
private getCachedRegex;
|
|
144
|
+
/**
|
|
145
|
+
* Task #34: Get cached Set for 'in' operator or create and cache it
|
|
146
|
+
* Using Set provides O(1) lookup instead of O(n) array.includes()
|
|
147
|
+
*/
|
|
148
|
+
private getCachedInOperatorSet;
|
|
149
|
+
/**
|
|
150
|
+
* Evaluate a single condition
|
|
151
|
+
* Task #34: Optimized with regex caching and Set-based 'in' operator
|
|
152
|
+
*/
|
|
153
|
+
private evaluateCondition;
|
|
154
|
+
/**
|
|
155
|
+
* Get nested value from object using dot notation
|
|
156
|
+
*/
|
|
157
|
+
private getNestedValue;
|
|
158
|
+
/**
|
|
159
|
+
* Calculate risk level from score
|
|
160
|
+
*/
|
|
161
|
+
private calculateRiskLevel;
|
|
162
|
+
/**
|
|
163
|
+
* Get severity level from a rule
|
|
164
|
+
*/
|
|
165
|
+
private getRuleSeverity;
|
|
166
|
+
/**
|
|
167
|
+
* Generate recommendation based on rule and action
|
|
168
|
+
*/
|
|
169
|
+
private getRecommendation;
|
|
170
|
+
/**
|
|
171
|
+
* Register default custom evaluators
|
|
172
|
+
*/
|
|
173
|
+
private registerDefaultEvaluators;
|
|
174
|
+
}
|
|
175
|
+
export declare const rulesEngine: RulesEngine;
|
|
176
|
+
//# sourceMappingURL=RulesEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RulesEngine.d.ts","sourceRoot":"","sources":["../../src/engine/RulesEngine.ts"],"names":[],"mappings":"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"}
|