@trentapps/manager-protocol 1.1.3 → 1.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/README.md +164 -17
- package/dist/analyzers/CSSAnalyzer.d.ts +180 -8
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/CSSAnalyzer.js +561 -105
- package/dist/analyzers/CSSAnalyzer.js.map +1 -1
- package/dist/config/dashboard.d.ts +55 -0
- package/dist/config/dashboard.d.ts.map +1 -0
- package/dist/config/dashboard.js +103 -0
- package/dist/config/dashboard.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/dashboard/httpDashboard.d.ts +100 -0
- package/dist/dashboard/httpDashboard.d.ts.map +1 -0
- package/dist/dashboard/httpDashboard.js +1276 -0
- package/dist/dashboard/httpDashboard.js.map +1 -0
- package/dist/dashboard/index.d.ts +6 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +370 -2
- package/dist/engine/AuditLogger.d.ts.map +1 -1
- package/dist/engine/AuditLogger.js +1064 -24
- package/dist/engine/AuditLogger.js.map +1 -1
- 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 +5 -3
- package/dist/engine/RateLimiter.d.ts.map +1 -1
- package/dist/engine/RateLimiter.js +49 -72
- package/dist/engine/RateLimiter.js.map +1 -1
- 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 +102 -3
- package/dist/engine/RulesEngine.d.ts.map +1 -1
- package/dist/engine/RulesEngine.js +326 -21
- package/dist/engine/RulesEngine.js.map +1 -1
- package/dist/engine/TaskManager.d.ts +10 -14
- package/dist/engine/TaskManager.d.ts.map +1 -1
- package/dist/engine/TaskManager.js +169 -197
- package/dist/engine/TaskManager.js.map +1 -1
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +5 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/rules/azure.d.ts.map +1 -1
- package/dist/rules/azure.js +12 -14
- package/dist/rules/azure.js.map +1 -1
- package/dist/rules/compliance.d.ts.map +1 -1
- package/dist/rules/compliance.js +23 -41
- package/dist/rules/compliance.js.map +1 -1
- 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.map +1 -1
- package/dist/rules/css.js +538 -0
- package/dist/rules/css.js.map +1 -1
- 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.map +1 -1
- package/dist/rules/flask.js +18 -31
- package/dist/rules/flask.js.map +1 -1
- package/dist/rules/index.d.ts +220 -0
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +155 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/ml-ai.d.ts.map +1 -1
- package/dist/rules/ml-ai.js +11 -13
- package/dist/rules/ml-ai.js.map +1 -1
- 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.map +1 -1
- package/dist/rules/security.js +580 -19
- package/dist/rules/security.js.map +1 -1
- 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 +8 -2
- package/dist/rules/storage.d.ts.map +1 -1
- package/dist/rules/storage.js +541 -3
- package/dist/rules/storage.js.map +1 -1
- package/dist/rules/stripe.d.ts.map +1 -1
- package/dist/rules/stripe.js +19 -26
- package/dist/rules/stripe.js.map +1 -1
- package/dist/rules/websocket.d.ts.map +1 -1
- package/dist/rules/websocket.js +32 -40
- package/dist/rules/websocket.js.map +1 -1
- package/dist/supervisor/AgentSupervisor.d.ts +52 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
- package/dist/supervisor/AgentSupervisor.js +120 -1
- package/dist/supervisor/AgentSupervisor.js.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
- package/dist/supervisor/ManagedServerRegistry.js +590 -6
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
- package/dist/supervisor/ProjectTracker.d.ts +2 -1
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
- package/dist/supervisor/ProjectTracker.js +5 -9
- package/dist/supervisor/ProjectTracker.js.map +1 -1
- 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 +265 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +57 -2
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- 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/package.json +3 -2
|
@@ -0,0 +1,640 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Validation Framework
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for validating rule structure, syntax, and detecting conflicts.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// CONSTANTS
|
|
8
|
+
// ============================================================================
|
|
9
|
+
const VALID_OPERATORS = [
|
|
10
|
+
'equals',
|
|
11
|
+
'not_equals',
|
|
12
|
+
'contains',
|
|
13
|
+
'not_contains',
|
|
14
|
+
'greater_than',
|
|
15
|
+
'less_than',
|
|
16
|
+
'in',
|
|
17
|
+
'not_in',
|
|
18
|
+
'matches_regex',
|
|
19
|
+
'exists',
|
|
20
|
+
'not_exists',
|
|
21
|
+
'custom'
|
|
22
|
+
];
|
|
23
|
+
const VALID_ACTION_TYPES = [
|
|
24
|
+
'allow',
|
|
25
|
+
'deny',
|
|
26
|
+
'require_approval',
|
|
27
|
+
'warn',
|
|
28
|
+
'log',
|
|
29
|
+
'rate_limit',
|
|
30
|
+
'transform',
|
|
31
|
+
'escalate',
|
|
32
|
+
'notify'
|
|
33
|
+
];
|
|
34
|
+
const VALID_RULE_TYPES = [
|
|
35
|
+
'compliance',
|
|
36
|
+
'security',
|
|
37
|
+
'operational',
|
|
38
|
+
'financial',
|
|
39
|
+
'ux',
|
|
40
|
+
'architecture',
|
|
41
|
+
'data_governance',
|
|
42
|
+
'rate_limit',
|
|
43
|
+
'custom'
|
|
44
|
+
];
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// RULE VALIDATION
|
|
47
|
+
// ============================================================================
|
|
48
|
+
/**
|
|
49
|
+
* Validate a single business rule
|
|
50
|
+
*/
|
|
51
|
+
export function validateRule(rule) {
|
|
52
|
+
const errors = [];
|
|
53
|
+
const warnings = [];
|
|
54
|
+
// Check if rule is an object
|
|
55
|
+
if (!rule || typeof rule !== 'object') {
|
|
56
|
+
return {
|
|
57
|
+
ruleId: 'unknown',
|
|
58
|
+
isValid: false,
|
|
59
|
+
errors: [{
|
|
60
|
+
code: 'INVALID_TYPE',
|
|
61
|
+
message: 'Rule must be an object',
|
|
62
|
+
severity: 'error'
|
|
63
|
+
}],
|
|
64
|
+
warnings: []
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const r = rule;
|
|
68
|
+
const ruleId = typeof r.id === 'string' ? r.id : 'unknown';
|
|
69
|
+
// Required fields
|
|
70
|
+
if (!r.id || typeof r.id !== 'string') {
|
|
71
|
+
errors.push({
|
|
72
|
+
code: 'MISSING_ID',
|
|
73
|
+
message: 'Rule must have a string id',
|
|
74
|
+
path: 'id',
|
|
75
|
+
severity: 'error'
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else if (!/^[a-z0-9-_]+$/i.test(r.id)) {
|
|
79
|
+
warnings.push({
|
|
80
|
+
code: 'INVALID_ID_FORMAT',
|
|
81
|
+
message: 'Rule id should only contain alphanumeric characters, hyphens, and underscores',
|
|
82
|
+
path: 'id',
|
|
83
|
+
severity: 'warning'
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (!r.name || typeof r.name !== 'string') {
|
|
87
|
+
errors.push({
|
|
88
|
+
code: 'MISSING_NAME',
|
|
89
|
+
message: 'Rule must have a string name',
|
|
90
|
+
path: 'name',
|
|
91
|
+
severity: 'error'
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else if (r.name.length < 3) {
|
|
95
|
+
warnings.push({
|
|
96
|
+
code: 'SHORT_NAME',
|
|
97
|
+
message: 'Rule name should be at least 3 characters',
|
|
98
|
+
path: 'name',
|
|
99
|
+
severity: 'warning'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (!r.type || !VALID_RULE_TYPES.includes(r.type)) {
|
|
103
|
+
errors.push({
|
|
104
|
+
code: 'INVALID_TYPE',
|
|
105
|
+
message: `Rule type must be one of: ${VALID_RULE_TYPES.join(', ')}`,
|
|
106
|
+
path: 'type',
|
|
107
|
+
severity: 'error'
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Priority validation
|
|
111
|
+
if (r.priority !== undefined) {
|
|
112
|
+
if (typeof r.priority !== 'number') {
|
|
113
|
+
errors.push({
|
|
114
|
+
code: 'INVALID_PRIORITY',
|
|
115
|
+
message: 'Priority must be a number',
|
|
116
|
+
path: 'priority',
|
|
117
|
+
severity: 'error'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
else if (r.priority < 0 || r.priority > 1000) {
|
|
121
|
+
warnings.push({
|
|
122
|
+
code: 'PRIORITY_OUT_OF_RANGE',
|
|
123
|
+
message: 'Priority should be between 0 and 1000',
|
|
124
|
+
path: 'priority',
|
|
125
|
+
severity: 'warning'
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Risk weight validation
|
|
130
|
+
if (r.riskWeight !== undefined) {
|
|
131
|
+
if (typeof r.riskWeight !== 'number') {
|
|
132
|
+
errors.push({
|
|
133
|
+
code: 'INVALID_RISK_WEIGHT',
|
|
134
|
+
message: 'Risk weight must be a number',
|
|
135
|
+
path: 'riskWeight',
|
|
136
|
+
severity: 'error'
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else if (r.riskWeight < 0 || r.riskWeight > 100) {
|
|
140
|
+
errors.push({
|
|
141
|
+
code: 'RISK_WEIGHT_OUT_OF_RANGE',
|
|
142
|
+
message: 'Risk weight must be between 0 and 100',
|
|
143
|
+
path: 'riskWeight',
|
|
144
|
+
severity: 'error'
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Conditions validation
|
|
149
|
+
if (!Array.isArray(r.conditions)) {
|
|
150
|
+
errors.push({
|
|
151
|
+
code: 'INVALID_CONDITIONS',
|
|
152
|
+
message: 'Conditions must be an array',
|
|
153
|
+
path: 'conditions',
|
|
154
|
+
severity: 'error'
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const conditionErrors = validateConditions(r.conditions);
|
|
159
|
+
errors.push(...conditionErrors.errors);
|
|
160
|
+
warnings.push(...conditionErrors.warnings);
|
|
161
|
+
}
|
|
162
|
+
// Condition logic validation
|
|
163
|
+
if (r.conditionLogic !== undefined && !['all', 'any'].includes(r.conditionLogic)) {
|
|
164
|
+
errors.push({
|
|
165
|
+
code: 'INVALID_CONDITION_LOGIC',
|
|
166
|
+
message: 'Condition logic must be "all" or "any"',
|
|
167
|
+
path: 'conditionLogic',
|
|
168
|
+
severity: 'error'
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Actions validation
|
|
172
|
+
if (!Array.isArray(r.actions)) {
|
|
173
|
+
errors.push({
|
|
174
|
+
code: 'INVALID_ACTIONS',
|
|
175
|
+
message: 'Actions must be an array',
|
|
176
|
+
path: 'actions',
|
|
177
|
+
severity: 'error'
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
else if (r.actions.length === 0) {
|
|
181
|
+
warnings.push({
|
|
182
|
+
code: 'EMPTY_ACTIONS',
|
|
183
|
+
message: 'Rule has no actions defined',
|
|
184
|
+
path: 'actions',
|
|
185
|
+
severity: 'warning'
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
const actionErrors = validateActions(r.actions);
|
|
190
|
+
errors.push(...actionErrors.errors);
|
|
191
|
+
warnings.push(...actionErrors.warnings);
|
|
192
|
+
}
|
|
193
|
+
// Tags validation
|
|
194
|
+
if (r.tags !== undefined) {
|
|
195
|
+
if (!Array.isArray(r.tags)) {
|
|
196
|
+
errors.push({
|
|
197
|
+
code: 'INVALID_TAGS',
|
|
198
|
+
message: 'Tags must be an array',
|
|
199
|
+
path: 'tags',
|
|
200
|
+
severity: 'error'
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
for (let i = 0; i < r.tags.length; i++) {
|
|
205
|
+
if (typeof r.tags[i] !== 'string') {
|
|
206
|
+
errors.push({
|
|
207
|
+
code: 'INVALID_TAG',
|
|
208
|
+
message: `Tag at index ${i} must be a string`,
|
|
209
|
+
path: `tags[${i}]`,
|
|
210
|
+
severity: 'error'
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
ruleId,
|
|
218
|
+
isValid: errors.length === 0,
|
|
219
|
+
errors,
|
|
220
|
+
warnings
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Validate an array of conditions
|
|
225
|
+
*/
|
|
226
|
+
export function validateConditions(conditions) {
|
|
227
|
+
const errors = [];
|
|
228
|
+
const warnings = [];
|
|
229
|
+
for (let i = 0; i < conditions.length; i++) {
|
|
230
|
+
const condition = conditions[i];
|
|
231
|
+
const path = `conditions[${i}]`;
|
|
232
|
+
if (!condition || typeof condition !== 'object') {
|
|
233
|
+
errors.push({
|
|
234
|
+
code: 'INVALID_CONDITION',
|
|
235
|
+
message: `Condition at index ${i} must be an object`,
|
|
236
|
+
path,
|
|
237
|
+
severity: 'error'
|
|
238
|
+
});
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
// Field validation
|
|
242
|
+
if (!condition.field || typeof condition.field !== 'string') {
|
|
243
|
+
errors.push({
|
|
244
|
+
code: 'MISSING_FIELD',
|
|
245
|
+
message: 'Condition must have a string field',
|
|
246
|
+
path: `${path}.field`,
|
|
247
|
+
severity: 'error'
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
// Operator validation
|
|
251
|
+
if (!condition.operator || !VALID_OPERATORS.includes(condition.operator)) {
|
|
252
|
+
errors.push({
|
|
253
|
+
code: 'INVALID_OPERATOR',
|
|
254
|
+
message: `Operator must be one of: ${VALID_OPERATORS.join(', ')}`,
|
|
255
|
+
path: `${path}.operator`,
|
|
256
|
+
severity: 'error'
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
// Value validation based on operator
|
|
260
|
+
const op = condition.operator;
|
|
261
|
+
if (op === 'in' || op === 'not_in') {
|
|
262
|
+
if (!Array.isArray(condition.value)) {
|
|
263
|
+
errors.push({
|
|
264
|
+
code: 'INVALID_VALUE_TYPE',
|
|
265
|
+
message: `Value for '${op}' operator must be an array`,
|
|
266
|
+
path: `${path}.value`,
|
|
267
|
+
severity: 'error'
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
if (op === 'greater_than' || op === 'less_than') {
|
|
272
|
+
if (typeof condition.value !== 'number') {
|
|
273
|
+
errors.push({
|
|
274
|
+
code: 'INVALID_VALUE_TYPE',
|
|
275
|
+
message: `Value for '${op}' operator must be a number`,
|
|
276
|
+
path: `${path}.value`,
|
|
277
|
+
severity: 'error'
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (op === 'matches_regex') {
|
|
282
|
+
if (typeof condition.value !== 'string') {
|
|
283
|
+
errors.push({
|
|
284
|
+
code: 'INVALID_VALUE_TYPE',
|
|
285
|
+
message: 'Value for matches_regex operator must be a string',
|
|
286
|
+
path: `${path}.value`,
|
|
287
|
+
severity: 'error'
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
// Validate regex syntax
|
|
292
|
+
try {
|
|
293
|
+
new RegExp(condition.value);
|
|
294
|
+
}
|
|
295
|
+
catch (e) {
|
|
296
|
+
errors.push({
|
|
297
|
+
code: 'INVALID_REGEX',
|
|
298
|
+
message: `Invalid regex pattern: ${e.message}`,
|
|
299
|
+
path: `${path}.value`,
|
|
300
|
+
severity: 'error'
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (op === 'custom' && !condition.customEvaluator) {
|
|
306
|
+
errors.push({
|
|
307
|
+
code: 'MISSING_CUSTOM_EVALUATOR',
|
|
308
|
+
message: 'Custom operator requires customEvaluator field',
|
|
309
|
+
path: `${path}.customEvaluator`,
|
|
310
|
+
severity: 'error'
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return { errors, warnings };
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Validate an array of actions
|
|
318
|
+
*/
|
|
319
|
+
function validateActions(actions) {
|
|
320
|
+
const errors = [];
|
|
321
|
+
const warnings = [];
|
|
322
|
+
let hasDeny = false;
|
|
323
|
+
let hasAllow = false;
|
|
324
|
+
for (let i = 0; i < actions.length; i++) {
|
|
325
|
+
const action = actions[i];
|
|
326
|
+
const path = `actions[${i}]`;
|
|
327
|
+
if (!action || typeof action !== 'object') {
|
|
328
|
+
errors.push({
|
|
329
|
+
code: 'INVALID_ACTION',
|
|
330
|
+
message: `Action at index ${i} must be an object`,
|
|
331
|
+
path,
|
|
332
|
+
severity: 'error'
|
|
333
|
+
});
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
if (!action.type || !VALID_ACTION_TYPES.includes(action.type)) {
|
|
337
|
+
errors.push({
|
|
338
|
+
code: 'INVALID_ACTION_TYPE',
|
|
339
|
+
message: `Action type must be one of: ${VALID_ACTION_TYPES.join(', ')}`,
|
|
340
|
+
path: `${path}.type`,
|
|
341
|
+
severity: 'error'
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
if (action.type === 'deny')
|
|
345
|
+
hasDeny = true;
|
|
346
|
+
if (action.type === 'allow')
|
|
347
|
+
hasAllow = true;
|
|
348
|
+
}
|
|
349
|
+
// Check for conflicting actions
|
|
350
|
+
if (hasDeny && hasAllow) {
|
|
351
|
+
warnings.push({
|
|
352
|
+
code: 'CONFLICTING_ACTIONS',
|
|
353
|
+
message: 'Rule has both deny and allow actions, deny will take precedence',
|
|
354
|
+
path: 'actions',
|
|
355
|
+
severity: 'warning'
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
return { errors, warnings };
|
|
359
|
+
}
|
|
360
|
+
// ============================================================================
|
|
361
|
+
// CONFLICT DETECTION
|
|
362
|
+
// ============================================================================
|
|
363
|
+
/**
|
|
364
|
+
* Check for conflicts between rules
|
|
365
|
+
*/
|
|
366
|
+
export function checkForConflicts(rules) {
|
|
367
|
+
const conflicts = [];
|
|
368
|
+
for (let i = 0; i < rules.length; i++) {
|
|
369
|
+
for (let j = i + 1; j < rules.length; j++) {
|
|
370
|
+
const rule1 = rules[i];
|
|
371
|
+
const rule2 = rules[j];
|
|
372
|
+
// Check for duplicate IDs
|
|
373
|
+
if (rule1.id === rule2.id) {
|
|
374
|
+
conflicts.push({
|
|
375
|
+
rule1: { id: rule1.id, name: rule1.name },
|
|
376
|
+
rule2: { id: rule2.id, name: rule2.name },
|
|
377
|
+
conflictType: 'duplicate_conditions',
|
|
378
|
+
description: 'Two rules have the same ID',
|
|
379
|
+
suggestion: 'Ensure each rule has a unique ID'
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
// Check for duplicate conditions
|
|
383
|
+
if (conditionsAreEqual(rule1.conditions, rule2.conditions)) {
|
|
384
|
+
// Check if actions contradict
|
|
385
|
+
const actions1 = new Set(rule1.actions.map(a => a.type));
|
|
386
|
+
const actions2 = new Set(rule2.actions.map(a => a.type));
|
|
387
|
+
if ((actions1.has('deny') && actions2.has('allow')) ||
|
|
388
|
+
(actions1.has('allow') && actions2.has('deny'))) {
|
|
389
|
+
conflicts.push({
|
|
390
|
+
rule1: { id: rule1.id, name: rule1.name },
|
|
391
|
+
rule2: { id: rule2.id, name: rule2.name },
|
|
392
|
+
conflictType: 'contradicting_actions',
|
|
393
|
+
description: 'Rules have identical conditions but contradicting actions (allow vs deny)',
|
|
394
|
+
suggestion: 'Review and consolidate these rules, or add distinguishing conditions'
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
conflicts.push({
|
|
399
|
+
rule1: { id: rule1.id, name: rule1.name },
|
|
400
|
+
rule2: { id: rule2.id, name: rule2.name },
|
|
401
|
+
conflictType: 'duplicate_conditions',
|
|
402
|
+
description: 'Rules have identical conditions',
|
|
403
|
+
suggestion: 'Consider merging these rules or adding distinguishing conditions'
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Check for shadowed rules
|
|
408
|
+
if (rulesShadow(rule1, rule2)) {
|
|
409
|
+
const shadowedRule = rule1.priority > rule2.priority ? rule2 : rule1;
|
|
410
|
+
const shadowingRule = rule1.priority > rule2.priority ? rule1 : rule2;
|
|
411
|
+
conflicts.push({
|
|
412
|
+
rule1: { id: shadowingRule.id, name: shadowingRule.name },
|
|
413
|
+
rule2: { id: shadowedRule.id, name: shadowedRule.name },
|
|
414
|
+
conflictType: 'shadowed_rule',
|
|
415
|
+
description: `Rule '${shadowedRule.name}' may never fire because '${shadowingRule.name}' has higher priority and broader conditions`,
|
|
416
|
+
suggestion: 'Review rule priorities or make conditions more specific'
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
hasConflicts: conflicts.length > 0,
|
|
423
|
+
conflicts
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Check if two condition arrays are equal
|
|
428
|
+
*/
|
|
429
|
+
function conditionsAreEqual(conds1, conds2) {
|
|
430
|
+
if (conds1.length !== conds2.length)
|
|
431
|
+
return false;
|
|
432
|
+
const sorted1 = [...conds1].sort((a, b) => `${a.field}${a.operator}`.localeCompare(`${b.field}${b.operator}`));
|
|
433
|
+
const sorted2 = [...conds2].sort((a, b) => `${a.field}${a.operator}`.localeCompare(`${b.field}${b.operator}`));
|
|
434
|
+
for (let i = 0; i < sorted1.length; i++) {
|
|
435
|
+
if (sorted1[i].field !== sorted2[i].field)
|
|
436
|
+
return false;
|
|
437
|
+
if (sorted1[i].operator !== sorted2[i].operator)
|
|
438
|
+
return false;
|
|
439
|
+
if (JSON.stringify(sorted1[i].value) !== JSON.stringify(sorted2[i].value))
|
|
440
|
+
return false;
|
|
441
|
+
}
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Check if one rule shadows another (more general conditions with higher priority)
|
|
446
|
+
*/
|
|
447
|
+
function rulesShadow(rule1, rule2) {
|
|
448
|
+
// A rule shadows another if it has higher priority and
|
|
449
|
+
// its conditions are a subset of (more general than) the other rule's conditions
|
|
450
|
+
if (rule1.priority <= rule2.priority)
|
|
451
|
+
return false;
|
|
452
|
+
// If rule1 has no conditions, it matches everything
|
|
453
|
+
if (rule1.conditions.length === 0)
|
|
454
|
+
return true;
|
|
455
|
+
// Check if rule1's conditions are a subset of rule2's
|
|
456
|
+
return conditionsAreSubset(rule1.conditions, rule2.conditions);
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Check if conds1 is a subset of conds2 (conds1 is more general)
|
|
460
|
+
*/
|
|
461
|
+
function conditionsAreSubset(conds1, conds2) {
|
|
462
|
+
// Every condition in conds1 must be satisfied by some condition in conds2
|
|
463
|
+
for (const c1 of conds1) {
|
|
464
|
+
const found = conds2.some(c2 => c1.field === c2.field &&
|
|
465
|
+
c1.operator === c2.operator &&
|
|
466
|
+
JSON.stringify(c1.value) === JSON.stringify(c2.value));
|
|
467
|
+
if (!found)
|
|
468
|
+
return false;
|
|
469
|
+
}
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
// ============================================================================
|
|
473
|
+
// RULE LINTING
|
|
474
|
+
// ============================================================================
|
|
475
|
+
/**
|
|
476
|
+
* Lint rules for potential issues and best practices
|
|
477
|
+
*/
|
|
478
|
+
export function lintRules(rules) {
|
|
479
|
+
const errors = [];
|
|
480
|
+
const warnings = [];
|
|
481
|
+
const suggestions = [];
|
|
482
|
+
// Check individual rules
|
|
483
|
+
for (const rule of rules) {
|
|
484
|
+
// Validate each rule first
|
|
485
|
+
const validation = validateRule(rule);
|
|
486
|
+
for (const error of validation.errors) {
|
|
487
|
+
errors.push({
|
|
488
|
+
code: error.code,
|
|
489
|
+
ruleId: rule.id,
|
|
490
|
+
message: error.message,
|
|
491
|
+
severity: 'error',
|
|
492
|
+
fix: error.path ? `Fix the value at ${error.path}` : undefined
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
for (const warning of validation.warnings) {
|
|
496
|
+
warnings.push({
|
|
497
|
+
code: warning.code,
|
|
498
|
+
ruleId: rule.id,
|
|
499
|
+
message: warning.message,
|
|
500
|
+
severity: 'warning'
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
// Check for missing description
|
|
504
|
+
if (!rule.description) {
|
|
505
|
+
suggestions.push({
|
|
506
|
+
code: 'MISSING_DESCRIPTION',
|
|
507
|
+
ruleId: rule.id,
|
|
508
|
+
message: 'Rule has no description',
|
|
509
|
+
severity: 'suggestion',
|
|
510
|
+
fix: 'Add a description explaining what this rule does and why'
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
// Check for missing tags
|
|
514
|
+
if (!rule.tags || rule.tags.length === 0) {
|
|
515
|
+
suggestions.push({
|
|
516
|
+
code: 'MISSING_TAGS',
|
|
517
|
+
ruleId: rule.id,
|
|
518
|
+
message: 'Rule has no tags',
|
|
519
|
+
severity: 'suggestion',
|
|
520
|
+
fix: 'Add tags to categorize the rule (e.g., security, compliance, pii)'
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
// Check for very high risk weight without approval
|
|
524
|
+
if (rule.riskWeight >= 50) {
|
|
525
|
+
const requiresApproval = rule.actions.some(a => a.type === 'require_approval' || a.type === 'deny');
|
|
526
|
+
if (!requiresApproval) {
|
|
527
|
+
warnings.push({
|
|
528
|
+
code: 'HIGH_RISK_NO_CONTROL',
|
|
529
|
+
ruleId: rule.id,
|
|
530
|
+
message: `Rule has high risk weight (${rule.riskWeight}) but no deny or require_approval action`,
|
|
531
|
+
severity: 'warning',
|
|
532
|
+
fix: 'Consider adding require_approval or deny action for high-risk rules'
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
// Check for empty conditions with deny action
|
|
537
|
+
if (rule.conditions.length === 0 && rule.actions.some(a => a.type === 'deny')) {
|
|
538
|
+
errors.push({
|
|
539
|
+
code: 'UNCONDITIONAL_DENY',
|
|
540
|
+
ruleId: rule.id,
|
|
541
|
+
message: 'Rule denies all actions unconditionally (no conditions)',
|
|
542
|
+
severity: 'error',
|
|
543
|
+
fix: 'Add conditions to restrict when the deny action applies'
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
// Check for very low priority with critical actions
|
|
547
|
+
if (rule.priority < 100 && rule.actions.some(a => a.type === 'deny')) {
|
|
548
|
+
warnings.push({
|
|
549
|
+
code: 'LOW_PRIORITY_DENY',
|
|
550
|
+
ruleId: rule.id,
|
|
551
|
+
message: 'Deny rule has very low priority and may be overridden',
|
|
552
|
+
severity: 'warning',
|
|
553
|
+
fix: 'Consider increasing priority for deny rules'
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
// Check for action without message
|
|
557
|
+
for (const action of rule.actions) {
|
|
558
|
+
if (['deny', 'warn', 'require_approval'].includes(action.type) && !action.message) {
|
|
559
|
+
suggestions.push({
|
|
560
|
+
code: 'ACTION_MISSING_MESSAGE',
|
|
561
|
+
ruleId: rule.id,
|
|
562
|
+
message: `${action.type} action has no message`,
|
|
563
|
+
severity: 'suggestion',
|
|
564
|
+
fix: 'Add a descriptive message to help users understand why this action was taken'
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
// Check for overly broad regex patterns
|
|
569
|
+
for (const condition of rule.conditions) {
|
|
570
|
+
if (condition.operator === 'matches_regex' && typeof condition.value === 'string') {
|
|
571
|
+
if (condition.value === '.*' || condition.value === '.+' || condition.value === '^.*$') {
|
|
572
|
+
warnings.push({
|
|
573
|
+
code: 'OVERLY_BROAD_REGEX',
|
|
574
|
+
ruleId: rule.id,
|
|
575
|
+
message: `Regex pattern '${condition.value}' matches almost everything`,
|
|
576
|
+
severity: 'warning',
|
|
577
|
+
fix: 'Use a more specific regex pattern'
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
// Check for conflicts
|
|
584
|
+
const conflictResult = checkForConflicts(rules);
|
|
585
|
+
for (const conflict of conflictResult.conflicts) {
|
|
586
|
+
const issue = {
|
|
587
|
+
code: `CONFLICT_${conflict.conflictType.toUpperCase()}`,
|
|
588
|
+
ruleId: `${conflict.rule1.id} <-> ${conflict.rule2.id}`,
|
|
589
|
+
message: conflict.description,
|
|
590
|
+
severity: conflict.conflictType === 'contradicting_actions' ? 'error' : 'warning',
|
|
591
|
+
fix: conflict.suggestion
|
|
592
|
+
};
|
|
593
|
+
if (conflict.conflictType === 'contradicting_actions') {
|
|
594
|
+
errors.push(issue);
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
warnings.push(issue);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
// Check for unused rule types
|
|
601
|
+
const usedTypes = new Set(rules.map(r => r.type));
|
|
602
|
+
const unusedTypes = VALID_RULE_TYPES.filter(t => !usedTypes.has(t));
|
|
603
|
+
if (unusedTypes.length > 0 && rules.length > 10) {
|
|
604
|
+
suggestions.push({
|
|
605
|
+
code: 'UNUSED_RULE_TYPES',
|
|
606
|
+
ruleId: 'global',
|
|
607
|
+
message: `No rules defined for types: ${unusedTypes.join(', ')}`,
|
|
608
|
+
severity: 'suggestion'
|
|
609
|
+
});
|
|
610
|
+
}
|
|
611
|
+
return {
|
|
612
|
+
totalIssues: errors.length + warnings.length + suggestions.length,
|
|
613
|
+
errors,
|
|
614
|
+
warnings,
|
|
615
|
+
suggestions
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
// ============================================================================
|
|
619
|
+
// BATCH VALIDATION
|
|
620
|
+
// ============================================================================
|
|
621
|
+
/**
|
|
622
|
+
* Validate multiple rules at once
|
|
623
|
+
*/
|
|
624
|
+
export function validateRules(rules) {
|
|
625
|
+
const results = rules.map(rule => validateRule(rule));
|
|
626
|
+
const valid = results.filter(r => r.isValid);
|
|
627
|
+
const invalid = results.filter(r => !r.isValid);
|
|
628
|
+
return {
|
|
629
|
+
valid,
|
|
630
|
+
invalid,
|
|
631
|
+
summary: {
|
|
632
|
+
total: rules.length,
|
|
633
|
+
valid: valid.length,
|
|
634
|
+
invalid: invalid.length,
|
|
635
|
+
errorCount: results.reduce((sum, r) => sum + r.errors.length, 0),
|
|
636
|
+
warningCount: results.reduce((sum, r) => sum + r.warnings.length, 0)
|
|
637
|
+
}
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
//# sourceMappingURL=rule-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-validator.js","sourceRoot":"","sources":["../../src/testing/rule-validator.ts"],"names":[],"mappings":"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"}
|