@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.
Files changed (142) hide show
  1. package/README.md +164 -17
  2. package/dist/analyzers/CSSAnalyzer.d.ts +180 -8
  3. package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
  4. package/dist/analyzers/CSSAnalyzer.js +561 -105
  5. package/dist/analyzers/CSSAnalyzer.js.map +1 -1
  6. package/dist/config/dashboard.d.ts +55 -0
  7. package/dist/config/dashboard.d.ts.map +1 -0
  8. package/dist/config/dashboard.js +103 -0
  9. package/dist/config/dashboard.js.map +1 -0
  10. package/dist/config/index.d.ts +7 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +7 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/dashboard/httpDashboard.d.ts +100 -0
  15. package/dist/dashboard/httpDashboard.d.ts.map +1 -0
  16. package/dist/dashboard/httpDashboard.js +1276 -0
  17. package/dist/dashboard/httpDashboard.js.map +1 -0
  18. package/dist/dashboard/index.d.ts +6 -0
  19. package/dist/dashboard/index.d.ts.map +1 -0
  20. package/dist/dashboard/index.js +7 -0
  21. package/dist/dashboard/index.js.map +1 -0
  22. package/dist/engine/AuditLogger.d.ts +370 -2
  23. package/dist/engine/AuditLogger.d.ts.map +1 -1
  24. package/dist/engine/AuditLogger.js +1064 -24
  25. package/dist/engine/AuditLogger.js.map +1 -1
  26. package/dist/engine/GitHubClient.d.ts +183 -0
  27. package/dist/engine/GitHubClient.d.ts.map +1 -0
  28. package/dist/engine/GitHubClient.js +411 -0
  29. package/dist/engine/GitHubClient.js.map +1 -0
  30. package/dist/engine/RateLimiter.d.ts +5 -3
  31. package/dist/engine/RateLimiter.d.ts.map +1 -1
  32. package/dist/engine/RateLimiter.js +49 -72
  33. package/dist/engine/RateLimiter.js.map +1 -1
  34. package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
  35. package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
  36. package/dist/engine/RuleDependencyAnalyzer.js +475 -0
  37. package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
  38. package/dist/engine/RulesEngine.d.ts +102 -3
  39. package/dist/engine/RulesEngine.d.ts.map +1 -1
  40. package/dist/engine/RulesEngine.js +326 -21
  41. package/dist/engine/RulesEngine.js.map +1 -1
  42. package/dist/engine/TaskManager.d.ts +10 -14
  43. package/dist/engine/TaskManager.d.ts.map +1 -1
  44. package/dist/engine/TaskManager.js +169 -197
  45. package/dist/engine/TaskManager.js.map +1 -1
  46. package/dist/engine/index.d.ts +3 -0
  47. package/dist/engine/index.d.ts.map +1 -1
  48. package/dist/engine/index.js +5 -0
  49. package/dist/engine/index.js.map +1 -1
  50. package/dist/rules/azure.d.ts.map +1 -1
  51. package/dist/rules/azure.js +12 -14
  52. package/dist/rules/azure.js.map +1 -1
  53. package/dist/rules/compliance.d.ts.map +1 -1
  54. package/dist/rules/compliance.js +23 -41
  55. package/dist/rules/compliance.js.map +1 -1
  56. package/dist/rules/condition-optimizer.d.ts +151 -0
  57. package/dist/rules/condition-optimizer.d.ts.map +1 -0
  58. package/dist/rules/condition-optimizer.js +479 -0
  59. package/dist/rules/condition-optimizer.js.map +1 -0
  60. package/dist/rules/css.d.ts.map +1 -1
  61. package/dist/rules/css.js +538 -0
  62. package/dist/rules/css.js.map +1 -1
  63. package/dist/rules/field-standards.d.ts +1172 -0
  64. package/dist/rules/field-standards.d.ts.map +1 -0
  65. package/dist/rules/field-standards.js +908 -0
  66. package/dist/rules/field-standards.js.map +1 -0
  67. package/dist/rules/flask.d.ts.map +1 -1
  68. package/dist/rules/flask.js +18 -31
  69. package/dist/rules/flask.js.map +1 -1
  70. package/dist/rules/index.d.ts +220 -0
  71. package/dist/rules/index.d.ts.map +1 -1
  72. package/dist/rules/index.js +155 -0
  73. package/dist/rules/index.js.map +1 -1
  74. package/dist/rules/ml-ai.d.ts.map +1 -1
  75. package/dist/rules/ml-ai.js +11 -13
  76. package/dist/rules/ml-ai.js.map +1 -1
  77. package/dist/rules/patterns.d.ts +568 -0
  78. package/dist/rules/patterns.d.ts.map +1 -0
  79. package/dist/rules/patterns.js +1359 -0
  80. package/dist/rules/patterns.js.map +1 -0
  81. package/dist/rules/security.d.ts.map +1 -1
  82. package/dist/rules/security.js +580 -19
  83. package/dist/rules/security.js.map +1 -1
  84. package/dist/rules/shared-patterns.d.ts +268 -0
  85. package/dist/rules/shared-patterns.d.ts.map +1 -0
  86. package/dist/rules/shared-patterns.js +556 -0
  87. package/dist/rules/shared-patterns.js.map +1 -0
  88. package/dist/rules/storage.d.ts +8 -2
  89. package/dist/rules/storage.d.ts.map +1 -1
  90. package/dist/rules/storage.js +541 -3
  91. package/dist/rules/storage.js.map +1 -1
  92. package/dist/rules/stripe.d.ts.map +1 -1
  93. package/dist/rules/stripe.js +19 -26
  94. package/dist/rules/stripe.js.map +1 -1
  95. package/dist/rules/websocket.d.ts.map +1 -1
  96. package/dist/rules/websocket.js +32 -40
  97. package/dist/rules/websocket.js.map +1 -1
  98. package/dist/supervisor/AgentSupervisor.d.ts +52 -0
  99. package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
  100. package/dist/supervisor/AgentSupervisor.js +120 -1
  101. package/dist/supervisor/AgentSupervisor.js.map +1 -1
  102. package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
  103. package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
  104. package/dist/supervisor/ManagedServerRegistry.js +590 -6
  105. package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
  106. package/dist/supervisor/ProjectTracker.d.ts +2 -1
  107. package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
  108. package/dist/supervisor/ProjectTracker.js +5 -9
  109. package/dist/supervisor/ProjectTracker.js.map +1 -1
  110. package/dist/testing/index.d.ts +11 -0
  111. package/dist/testing/index.d.ts.map +1 -0
  112. package/dist/testing/index.js +12 -0
  113. package/dist/testing/index.js.map +1 -0
  114. package/dist/testing/rule-tester.d.ts +217 -0
  115. package/dist/testing/rule-tester.d.ts.map +1 -0
  116. package/dist/testing/rule-tester.examples.d.ts +57 -0
  117. package/dist/testing/rule-tester.examples.d.ts.map +1 -0
  118. package/dist/testing/rule-tester.examples.js +375 -0
  119. package/dist/testing/rule-tester.examples.js.map +1 -0
  120. package/dist/testing/rule-tester.js +381 -0
  121. package/dist/testing/rule-tester.js.map +1 -0
  122. package/dist/testing/rule-validator.d.ts +141 -0
  123. package/dist/testing/rule-validator.d.ts.map +1 -0
  124. package/dist/testing/rule-validator.js +640 -0
  125. package/dist/testing/rule-validator.js.map +1 -0
  126. package/dist/types/index.d.ts +265 -4
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +57 -2
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/utils/index.d.ts +2 -0
  131. package/dist/utils/index.d.ts.map +1 -1
  132. package/dist/utils/index.js +2 -0
  133. package/dist/utils/index.js.map +1 -1
  134. package/dist/utils/rate-limiting.d.ts +268 -0
  135. package/dist/utils/rate-limiting.d.ts.map +1 -0
  136. package/dist/utils/rate-limiting.js +403 -0
  137. package/dist/utils/rate-limiting.js.map +1 -0
  138. package/dist/utils/shared.d.ts +306 -0
  139. package/dist/utils/shared.d.ts.map +1 -0
  140. package/dist/utils/shared.js +464 -0
  141. package/dist/utils/shared.js.map +1 -0
  142. 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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"}