@trentapps/manager-protocol 1.1.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -1
- package/dist/analyzers/CSSAnalyzer.d.ts +188 -8
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
- package/dist/analyzers/CSSAnalyzer.js +794 -192
- package/dist/analyzers/CSSAnalyzer.js.map +1 -1
- package/dist/cli.js +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 +1067 -24
- package/dist/engine/AuditLogger.js.map +1 -1
- package/dist/engine/GitHubApprovalManager.d.ts +13 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -1
- package/dist/engine/GitHubApprovalManager.js +72 -46
- package/dist/engine/GitHubApprovalManager.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 +53 -70
- 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 +11 -10
- package/dist/engine/TaskManager.d.ts.map +1 -1
- package/dist/engine/TaskManager.js +180 -195
- 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/server.d.ts.map +1 -1
- package/dist/server.js +96 -17
- package/dist/server.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 +24 -2
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
- package/dist/supervisor/ProjectTracker.js +151 -59
- 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 +2 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Testing Framework
|
|
3
|
+
*
|
|
4
|
+
* Provides utilities for testing individual business rules and verifying their behavior.
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentAction, BusinessRule, BusinessContext, EvaluationResult, RiskLevel } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Test case for rule evaluation
|
|
9
|
+
*/
|
|
10
|
+
export interface RuleTestCase {
|
|
11
|
+
/** Unique test case identifier */
|
|
12
|
+
id?: string;
|
|
13
|
+
/** Human-readable description of what this test verifies */
|
|
14
|
+
description: string;
|
|
15
|
+
/** Input action to evaluate */
|
|
16
|
+
input: TestInput;
|
|
17
|
+
/** Expected evaluation result */
|
|
18
|
+
expectedResult: ExpectedResult;
|
|
19
|
+
/** Whether this test should be skipped */
|
|
20
|
+
skip?: boolean;
|
|
21
|
+
/** Whether this is the only test to run (for debugging) */
|
|
22
|
+
only?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Input for a rule test case
|
|
26
|
+
*/
|
|
27
|
+
export interface TestInput {
|
|
28
|
+
/** Agent action to evaluate */
|
|
29
|
+
action: Partial<AgentAction> & {
|
|
30
|
+
name: string;
|
|
31
|
+
category: AgentAction['category'];
|
|
32
|
+
};
|
|
33
|
+
/** Optional business context */
|
|
34
|
+
context?: Partial<BusinessContext>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Expected result for a rule test case
|
|
38
|
+
*/
|
|
39
|
+
export interface ExpectedResult {
|
|
40
|
+
/** Whether the rule should match */
|
|
41
|
+
shouldMatch: boolean;
|
|
42
|
+
/** Expected status (if rule matches) */
|
|
43
|
+
status?: EvaluationResult['status'];
|
|
44
|
+
/** Whether action should be allowed */
|
|
45
|
+
allowed?: boolean;
|
|
46
|
+
/** Expected risk level */
|
|
47
|
+
riskLevel?: RiskLevel;
|
|
48
|
+
/** Minimum risk score */
|
|
49
|
+
minRiskScore?: number;
|
|
50
|
+
/** Maximum risk score */
|
|
51
|
+
maxRiskScore?: number;
|
|
52
|
+
/** Whether human approval should be required */
|
|
53
|
+
requiresHumanApproval?: boolean;
|
|
54
|
+
/** Expected violation count */
|
|
55
|
+
violationCount?: number;
|
|
56
|
+
/** Expected warning count */
|
|
57
|
+
warningCount?: number;
|
|
58
|
+
/** Specific violation messages to check for */
|
|
59
|
+
violationMessages?: string[];
|
|
60
|
+
/** Specific warning messages to check for */
|
|
61
|
+
warningMessages?: string[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Result of running a single test case
|
|
65
|
+
*/
|
|
66
|
+
export interface TestCaseResult {
|
|
67
|
+
/** Test case ID */
|
|
68
|
+
testCaseId: string;
|
|
69
|
+
/** Test case description */
|
|
70
|
+
description: string;
|
|
71
|
+
/** Whether the test passed */
|
|
72
|
+
passed: boolean;
|
|
73
|
+
/** Test was skipped */
|
|
74
|
+
skipped: boolean;
|
|
75
|
+
/** Actual evaluation result */
|
|
76
|
+
actualResult?: EvaluationResult;
|
|
77
|
+
/** List of assertion failures */
|
|
78
|
+
failures: AssertionFailure[];
|
|
79
|
+
/** Execution time in ms */
|
|
80
|
+
durationMs: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Assertion failure details
|
|
84
|
+
*/
|
|
85
|
+
export interface AssertionFailure {
|
|
86
|
+
/** What was being checked */
|
|
87
|
+
assertion: string;
|
|
88
|
+
/** Expected value */
|
|
89
|
+
expected: unknown;
|
|
90
|
+
/** Actual value */
|
|
91
|
+
actual: unknown;
|
|
92
|
+
/** Error message */
|
|
93
|
+
message: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Result of running all tests for a rule
|
|
97
|
+
*/
|
|
98
|
+
export interface RuleTestResult {
|
|
99
|
+
/** Rule being tested */
|
|
100
|
+
ruleId: string;
|
|
101
|
+
/** Rule name */
|
|
102
|
+
ruleName: string;
|
|
103
|
+
/** Total test cases */
|
|
104
|
+
totalTests: number;
|
|
105
|
+
/** Passed test cases */
|
|
106
|
+
passedTests: number;
|
|
107
|
+
/** Failed test cases */
|
|
108
|
+
failedTests: number;
|
|
109
|
+
/** Skipped test cases */
|
|
110
|
+
skippedTests: number;
|
|
111
|
+
/** Individual test case results */
|
|
112
|
+
testCaseResults: TestCaseResult[];
|
|
113
|
+
/** Total execution time */
|
|
114
|
+
totalDurationMs: number;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* RuleTester class for testing individual business rules
|
|
118
|
+
*/
|
|
119
|
+
export declare class RuleTester {
|
|
120
|
+
private engine;
|
|
121
|
+
private verbose;
|
|
122
|
+
constructor(options?: {
|
|
123
|
+
verbose?: boolean;
|
|
124
|
+
});
|
|
125
|
+
/**
|
|
126
|
+
* Test a single rule against multiple test cases
|
|
127
|
+
*/
|
|
128
|
+
testRule(rule: BusinessRule, testCases: RuleTestCase[]): RuleTestResult;
|
|
129
|
+
/**
|
|
130
|
+
* Run a single test case
|
|
131
|
+
*/
|
|
132
|
+
private runTestCase;
|
|
133
|
+
/**
|
|
134
|
+
* Log a test failure in verbose mode
|
|
135
|
+
*/
|
|
136
|
+
private logFailure;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Test a single rule against multiple test cases (convenience function)
|
|
140
|
+
*/
|
|
141
|
+
export declare function testRule(rule: BusinessRule, testCases: RuleTestCase[]): RuleTestResult;
|
|
142
|
+
/**
|
|
143
|
+
* Create a test case with defaults
|
|
144
|
+
*/
|
|
145
|
+
export declare function createTestCase(description: string, action: Partial<AgentAction> & {
|
|
146
|
+
name: string;
|
|
147
|
+
category: AgentAction['category'];
|
|
148
|
+
}, expectedResult: ExpectedResult, context?: Partial<BusinessContext>): RuleTestCase;
|
|
149
|
+
/**
|
|
150
|
+
* Create a test case that expects the rule to match and deny
|
|
151
|
+
*/
|
|
152
|
+
export declare function expectDeny(description: string, action: Partial<AgentAction> & {
|
|
153
|
+
name: string;
|
|
154
|
+
category: AgentAction['category'];
|
|
155
|
+
}, options?: {
|
|
156
|
+
context?: Partial<BusinessContext>;
|
|
157
|
+
violationMessages?: string[];
|
|
158
|
+
}): RuleTestCase;
|
|
159
|
+
/**
|
|
160
|
+
* Create a test case that expects the rule to match and require approval
|
|
161
|
+
*/
|
|
162
|
+
export declare function expectApproval(description: string, action: Partial<AgentAction> & {
|
|
163
|
+
name: string;
|
|
164
|
+
category: AgentAction['category'];
|
|
165
|
+
}, options?: {
|
|
166
|
+
context?: Partial<BusinessContext>;
|
|
167
|
+
}): RuleTestCase;
|
|
168
|
+
/**
|
|
169
|
+
* Create a test case that expects the rule to match and warn
|
|
170
|
+
*/
|
|
171
|
+
export declare function expectWarn(description: string, action: Partial<AgentAction> & {
|
|
172
|
+
name: string;
|
|
173
|
+
category: AgentAction['category'];
|
|
174
|
+
}, options?: {
|
|
175
|
+
context?: Partial<BusinessContext>;
|
|
176
|
+
warningMessages?: string[];
|
|
177
|
+
}): RuleTestCase;
|
|
178
|
+
/**
|
|
179
|
+
* Create a test case that expects the rule NOT to match
|
|
180
|
+
*/
|
|
181
|
+
export declare function expectNoMatch(description: string, action: Partial<AgentAction> & {
|
|
182
|
+
name: string;
|
|
183
|
+
category: AgentAction['category'];
|
|
184
|
+
}, context?: Partial<BusinessContext>): RuleTestCase;
|
|
185
|
+
/**
|
|
186
|
+
* Create a test case that expects the rule to match and allow
|
|
187
|
+
*/
|
|
188
|
+
export declare function expectAllow(description: string, action: Partial<AgentAction> & {
|
|
189
|
+
name: string;
|
|
190
|
+
category: AgentAction['category'];
|
|
191
|
+
}, context?: Partial<BusinessContext>): RuleTestCase;
|
|
192
|
+
/**
|
|
193
|
+
* Assertion helpers for use with testing frameworks like vitest
|
|
194
|
+
*/
|
|
195
|
+
export declare const assertions: {
|
|
196
|
+
/**
|
|
197
|
+
* Assert that a rule matches the given action
|
|
198
|
+
*/
|
|
199
|
+
ruleMatches(rule: BusinessRule, action: AgentAction, context?: BusinessContext): boolean;
|
|
200
|
+
/**
|
|
201
|
+
* Assert that a rule denies the given action
|
|
202
|
+
*/
|
|
203
|
+
ruleDenies(rule: BusinessRule, action: AgentAction, context?: BusinessContext): boolean;
|
|
204
|
+
/**
|
|
205
|
+
* Assert that a rule requires approval for the given action
|
|
206
|
+
*/
|
|
207
|
+
ruleRequiresApproval(rule: BusinessRule, action: AgentAction, context?: BusinessContext): boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Assert that a rule produces a warning for the given action
|
|
210
|
+
*/
|
|
211
|
+
ruleWarns(rule: BusinessRule, action: AgentAction, context?: BusinessContext): boolean;
|
|
212
|
+
/**
|
|
213
|
+
* Assert that a rule allows the given action
|
|
214
|
+
*/
|
|
215
|
+
ruleAllows(rule: BusinessRule, action: AgentAction, context?: BusinessContext): boolean;
|
|
216
|
+
};
|
|
217
|
+
//# sourceMappingURL=rule-tester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tester.d.ts","sourceRoot":"","sources":["../../src/testing/rule-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Testing Framework Examples
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the RuleTester class to test business rules.
|
|
5
|
+
* These examples can be run with vitest or used as reference for writing your own tests.
|
|
6
|
+
*/
|
|
7
|
+
import type { BusinessRule } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Example security rule that blocks PII access without authorization
|
|
10
|
+
*/
|
|
11
|
+
export declare const examplePiiAccessRule: BusinessRule;
|
|
12
|
+
/**
|
|
13
|
+
* Example rule that requires approval for production deployments
|
|
14
|
+
*/
|
|
15
|
+
export declare const exampleProductionDeployRule: BusinessRule;
|
|
16
|
+
/**
|
|
17
|
+
* Example rule that warns about large data operations
|
|
18
|
+
*/
|
|
19
|
+
export declare const exampleLargeDataWarningRule: BusinessRule;
|
|
20
|
+
/**
|
|
21
|
+
* Example rule with dependencies
|
|
22
|
+
*/
|
|
23
|
+
export declare const exampleAuthCheckRule: BusinessRule;
|
|
24
|
+
export declare const exampleApiCallRule: BusinessRule;
|
|
25
|
+
/**
|
|
26
|
+
* Example: Testing PII access rule with RuleTester class
|
|
27
|
+
*/
|
|
28
|
+
export declare function runPiiAccessRuleTests(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Example: Using convenience functions for test cases
|
|
31
|
+
*/
|
|
32
|
+
export declare function runProductionDeployTests(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Example: Testing warning rules
|
|
35
|
+
*/
|
|
36
|
+
export declare function runLargeDataWarningTests(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Example: Using assertion helpers for vitest/jest integration
|
|
39
|
+
*/
|
|
40
|
+
export declare function demonstrateAssertions(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Example: Validating rule structure
|
|
43
|
+
*/
|
|
44
|
+
export declare function demonstrateValidation(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Example: Checking for rule conflicts
|
|
47
|
+
*/
|
|
48
|
+
export declare function demonstrateConflictDetection(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Example: Linting rules for best practices
|
|
51
|
+
*/
|
|
52
|
+
export declare function demonstrateLinting(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Run all examples to demonstrate the testing framework
|
|
55
|
+
*/
|
|
56
|
+
export declare function runAllExamples(): void;
|
|
57
|
+
//# sourceMappingURL=rule-tester.examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tester.examples.d.ts","sourceRoot":"","sources":["../../src/testing/rule-tester.examples.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAgBnE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAiBlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,YAiBzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,YAgBzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,YAgBlC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,YAmBhC,CAAC;AAMF;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAgF5C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CA0C/C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CA2B/C;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CA8B5C;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAiB5C;AAED;;GAEG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAoCnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAsBzC;AAMD;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAiBrC"}
|
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rule Testing Framework Examples
|
|
3
|
+
*
|
|
4
|
+
* This file demonstrates how to use the RuleTester class to test business rules.
|
|
5
|
+
* These examples can be run with vitest or used as reference for writing your own tests.
|
|
6
|
+
*/
|
|
7
|
+
import { RuleTester, testRule, createTestCase, expectApproval, expectWarn, expectNoMatch, assertions } from './rule-tester.js';
|
|
8
|
+
import { validateRule, checkForConflicts, lintRules } from './rule-validator.js';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// EXAMPLE RULE DEFINITIONS
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Example security rule that blocks PII access without authorization
|
|
14
|
+
*/
|
|
15
|
+
export const examplePiiAccessRule = {
|
|
16
|
+
id: 'example-pii-access',
|
|
17
|
+
name: 'Block PII Access Without Authorization',
|
|
18
|
+
description: 'Prevents unauthorized access to personally identifiable information',
|
|
19
|
+
type: 'security',
|
|
20
|
+
enabled: true,
|
|
21
|
+
priority: 950,
|
|
22
|
+
conditions: [
|
|
23
|
+
{ field: 'actionCategory', operator: 'equals', value: 'pii_access' },
|
|
24
|
+
{ field: 'userRole', operator: 'not_in', value: ['admin', 'data_officer', 'compliance'] }
|
|
25
|
+
],
|
|
26
|
+
conditionLogic: 'all',
|
|
27
|
+
actions: [
|
|
28
|
+
{ type: 'deny', message: 'PII access requires authorized role' }
|
|
29
|
+
],
|
|
30
|
+
riskWeight: 45,
|
|
31
|
+
tags: ['pii', 'gdpr', 'privacy']
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Example rule that requires approval for production deployments
|
|
35
|
+
*/
|
|
36
|
+
export const exampleProductionDeployRule = {
|
|
37
|
+
id: 'example-prod-deploy',
|
|
38
|
+
name: 'Require Approval for Production Deployment',
|
|
39
|
+
description: 'Requires human approval for deploying to production',
|
|
40
|
+
type: 'operational',
|
|
41
|
+
enabled: true,
|
|
42
|
+
priority: 900,
|
|
43
|
+
conditions: [
|
|
44
|
+
{ field: 'actionName', operator: 'contains', value: 'deploy' },
|
|
45
|
+
{ field: 'environment', operator: 'equals', value: 'production' }
|
|
46
|
+
],
|
|
47
|
+
conditionLogic: 'all',
|
|
48
|
+
actions: [
|
|
49
|
+
{ type: 'require_approval', message: 'Production deployments require approval' }
|
|
50
|
+
],
|
|
51
|
+
riskWeight: 35,
|
|
52
|
+
tags: ['deployment', 'production']
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Example rule that warns about large data operations
|
|
56
|
+
*/
|
|
57
|
+
export const exampleLargeDataWarningRule = {
|
|
58
|
+
id: 'example-large-data-warning',
|
|
59
|
+
name: 'Warn on Large Data Operations',
|
|
60
|
+
description: 'Warns when operating on more than 10,000 records',
|
|
61
|
+
type: 'data_governance',
|
|
62
|
+
enabled: true,
|
|
63
|
+
priority: 700,
|
|
64
|
+
conditions: [
|
|
65
|
+
{ field: 'recordCount', operator: 'greater_than', value: 10000 }
|
|
66
|
+
],
|
|
67
|
+
conditionLogic: 'all',
|
|
68
|
+
actions: [
|
|
69
|
+
{ type: 'warn', message: 'Large data operation detected (>10,000 records)' }
|
|
70
|
+
],
|
|
71
|
+
riskWeight: 15,
|
|
72
|
+
tags: ['data', 'performance']
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Example rule with dependencies
|
|
76
|
+
*/
|
|
77
|
+
export const exampleAuthCheckRule = {
|
|
78
|
+
id: 'example-auth-check',
|
|
79
|
+
name: 'Check Authentication First',
|
|
80
|
+
description: 'Base authentication check that other rules depend on',
|
|
81
|
+
type: 'security',
|
|
82
|
+
enabled: true,
|
|
83
|
+
priority: 1000,
|
|
84
|
+
conditions: [
|
|
85
|
+
{ field: 'authToken', operator: 'not_exists', value: null }
|
|
86
|
+
],
|
|
87
|
+
conditionLogic: 'all',
|
|
88
|
+
actions: [
|
|
89
|
+
{ type: 'deny', message: 'Authentication required' }
|
|
90
|
+
],
|
|
91
|
+
riskWeight: 50,
|
|
92
|
+
tags: ['authentication']
|
|
93
|
+
};
|
|
94
|
+
export const exampleApiCallRule = {
|
|
95
|
+
id: 'example-api-call',
|
|
96
|
+
name: 'API Call Logging',
|
|
97
|
+
description: 'Logs all external API calls',
|
|
98
|
+
type: 'operational',
|
|
99
|
+
enabled: true,
|
|
100
|
+
priority: 800,
|
|
101
|
+
conditions: [
|
|
102
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
103
|
+
],
|
|
104
|
+
conditionLogic: 'all',
|
|
105
|
+
actions: [
|
|
106
|
+
{ type: 'log', message: 'External API call detected' },
|
|
107
|
+
{ type: 'allow' }
|
|
108
|
+
],
|
|
109
|
+
riskWeight: 10,
|
|
110
|
+
tags: ['api', 'logging'],
|
|
111
|
+
dependsOn: ['example-auth-check'], // Must check auth first
|
|
112
|
+
relatedRules: ['example-pii-access']
|
|
113
|
+
};
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// EXAMPLE TEST CASES USING RuleTester
|
|
116
|
+
// ============================================================================
|
|
117
|
+
/**
|
|
118
|
+
* Example: Testing PII access rule with RuleTester class
|
|
119
|
+
*/
|
|
120
|
+
export function runPiiAccessRuleTests() {
|
|
121
|
+
const tester = new RuleTester({ verbose: true });
|
|
122
|
+
const result = tester.testRule(examplePiiAccessRule, [
|
|
123
|
+
// Test 1: Should deny unauthorized user accessing PII
|
|
124
|
+
{
|
|
125
|
+
description: 'Should deny regular user accessing PII',
|
|
126
|
+
input: {
|
|
127
|
+
action: {
|
|
128
|
+
name: 'read_customer_data',
|
|
129
|
+
category: 'pii_access'
|
|
130
|
+
},
|
|
131
|
+
context: {
|
|
132
|
+
userRole: 'developer'
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
expectedResult: {
|
|
136
|
+
shouldMatch: true,
|
|
137
|
+
status: 'denied',
|
|
138
|
+
allowed: false,
|
|
139
|
+
violationCount: 1
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
// Test 2: Should allow admin to access PII
|
|
143
|
+
{
|
|
144
|
+
description: 'Should allow admin to access PII',
|
|
145
|
+
input: {
|
|
146
|
+
action: {
|
|
147
|
+
name: 'read_customer_data',
|
|
148
|
+
category: 'pii_access'
|
|
149
|
+
},
|
|
150
|
+
context: {
|
|
151
|
+
userRole: 'admin'
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
expectedResult: {
|
|
155
|
+
shouldMatch: false // Rule should not match for authorized users
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// Test 3: Should allow data_officer to access PII
|
|
159
|
+
{
|
|
160
|
+
description: 'Should allow data_officer to access PII',
|
|
161
|
+
input: {
|
|
162
|
+
action: {
|
|
163
|
+
name: 'export_user_emails',
|
|
164
|
+
category: 'pii_access'
|
|
165
|
+
},
|
|
166
|
+
context: {
|
|
167
|
+
userRole: 'data_officer'
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
expectedResult: {
|
|
171
|
+
shouldMatch: false
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
// Test 4: Should not match non-PII access
|
|
175
|
+
{
|
|
176
|
+
description: 'Should not match non-PII data access',
|
|
177
|
+
input: {
|
|
178
|
+
action: {
|
|
179
|
+
name: 'read_public_stats',
|
|
180
|
+
category: 'data_access'
|
|
181
|
+
},
|
|
182
|
+
context: {
|
|
183
|
+
userRole: 'developer'
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
expectedResult: {
|
|
187
|
+
shouldMatch: false
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
]);
|
|
191
|
+
console.log('\nPII Access Rule Test Results:');
|
|
192
|
+
console.log(` Total: ${result.totalTests}`);
|
|
193
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
194
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Example: Using convenience functions for test cases
|
|
198
|
+
*/
|
|
199
|
+
export function runProductionDeployTests() {
|
|
200
|
+
const result = testRule(exampleProductionDeployRule, [
|
|
201
|
+
// Using expectApproval helper
|
|
202
|
+
expectApproval('Should require approval for production deployment', {
|
|
203
|
+
name: 'deploy_service',
|
|
204
|
+
category: 'code_execution'
|
|
205
|
+
}, { context: { environment: 'production' } }),
|
|
206
|
+
// Using expectNoMatch helper
|
|
207
|
+
expectNoMatch('Should not require approval for staging deployment', {
|
|
208
|
+
name: 'deploy_service',
|
|
209
|
+
category: 'code_execution'
|
|
210
|
+
}, { environment: 'staging' }),
|
|
211
|
+
// Using createTestCase for custom expectations
|
|
212
|
+
createTestCase('Should require approval only when deploying to production', {
|
|
213
|
+
name: 'deploy_application',
|
|
214
|
+
category: 'code_execution'
|
|
215
|
+
}, {
|
|
216
|
+
shouldMatch: true,
|
|
217
|
+
status: 'pending_approval',
|
|
218
|
+
requiresHumanApproval: true
|
|
219
|
+
}, { environment: 'production' })
|
|
220
|
+
]);
|
|
221
|
+
console.log('\nProduction Deploy Rule Test Results:');
|
|
222
|
+
console.log(` Total: ${result.totalTests}`);
|
|
223
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
224
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Example: Testing warning rules
|
|
228
|
+
*/
|
|
229
|
+
export function runLargeDataWarningTests() {
|
|
230
|
+
const result = testRule(exampleLargeDataWarningRule, [
|
|
231
|
+
// Using expectWarn helper
|
|
232
|
+
expectWarn('Should warn for large data operations', {
|
|
233
|
+
name: 'bulk_update',
|
|
234
|
+
category: 'data_modification',
|
|
235
|
+
parameters: { recordCount: 50000 }
|
|
236
|
+
}),
|
|
237
|
+
// Should not warn for small operations
|
|
238
|
+
expectNoMatch('Should not warn for small data operations', {
|
|
239
|
+
name: 'update_record',
|
|
240
|
+
category: 'data_modification',
|
|
241
|
+
parameters: { recordCount: 100 }
|
|
242
|
+
})
|
|
243
|
+
]);
|
|
244
|
+
console.log('\nLarge Data Warning Rule Test Results:');
|
|
245
|
+
console.log(` Total: ${result.totalTests}`);
|
|
246
|
+
console.log(` Passed: ${result.passedTests}`);
|
|
247
|
+
console.log(` Failed: ${result.failedTests}`);
|
|
248
|
+
}
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// EXAMPLE: USING ASSERTION HELPERS
|
|
251
|
+
// ============================================================================
|
|
252
|
+
/**
|
|
253
|
+
* Example: Using assertion helpers for vitest/jest integration
|
|
254
|
+
*/
|
|
255
|
+
export function demonstrateAssertions() {
|
|
256
|
+
const action = {
|
|
257
|
+
name: 'read_customer_data',
|
|
258
|
+
category: 'pii_access'
|
|
259
|
+
};
|
|
260
|
+
const unauthorizedContext = { userRole: 'developer' };
|
|
261
|
+
const authorizedContext = { userRole: 'admin' };
|
|
262
|
+
// Using assertion helpers
|
|
263
|
+
const matchesUnauthorized = assertions.ruleMatches(examplePiiAccessRule, action, unauthorizedContext);
|
|
264
|
+
console.log(`Rule matches unauthorized access: ${matchesUnauthorized}`); // true
|
|
265
|
+
const matchesAuthorized = assertions.ruleMatches(examplePiiAccessRule, action, authorizedContext);
|
|
266
|
+
console.log(`Rule matches authorized access: ${matchesAuthorized}`); // false
|
|
267
|
+
const deniesUnauthorized = assertions.ruleDenies(examplePiiAccessRule, action, unauthorizedContext);
|
|
268
|
+
console.log(`Rule denies unauthorized access: ${deniesUnauthorized}`); // true
|
|
269
|
+
}
|
|
270
|
+
// ============================================================================
|
|
271
|
+
// EXAMPLE: RULE VALIDATION
|
|
272
|
+
// ============================================================================
|
|
273
|
+
/**
|
|
274
|
+
* Example: Validating rule structure
|
|
275
|
+
*/
|
|
276
|
+
export function demonstrateValidation() {
|
|
277
|
+
// Valid rule
|
|
278
|
+
const validResult = validateRule(examplePiiAccessRule);
|
|
279
|
+
console.log('\nValid rule validation:');
|
|
280
|
+
console.log(` Is valid: ${validResult.isValid}`);
|
|
281
|
+
console.log(` Errors: ${validResult.errors.length}`);
|
|
282
|
+
console.log(` Warnings: ${validResult.warnings.length}`);
|
|
283
|
+
// Invalid rule (missing required fields)
|
|
284
|
+
const invalidRule = {
|
|
285
|
+
id: 'invalid-rule',
|
|
286
|
+
// Missing name, type, conditions, actions
|
|
287
|
+
};
|
|
288
|
+
const invalidResult = validateRule(invalidRule);
|
|
289
|
+
console.log('\nInvalid rule validation:');
|
|
290
|
+
console.log(` Is valid: ${invalidResult.isValid}`);
|
|
291
|
+
console.log(` Errors: ${invalidResult.errors.map(e => e.message).join(', ')}`);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Example: Checking for rule conflicts
|
|
295
|
+
*/
|
|
296
|
+
export function demonstrateConflictDetection() {
|
|
297
|
+
// Create two rules with conflicting actions
|
|
298
|
+
const rule1 = {
|
|
299
|
+
id: 'conflict-allow',
|
|
300
|
+
name: 'Allow API Calls',
|
|
301
|
+
type: 'operational',
|
|
302
|
+
enabled: true,
|
|
303
|
+
priority: 500,
|
|
304
|
+
conditions: [
|
|
305
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
306
|
+
],
|
|
307
|
+
conditionLogic: 'all',
|
|
308
|
+
actions: [{ type: 'allow' }],
|
|
309
|
+
riskWeight: 0
|
|
310
|
+
};
|
|
311
|
+
const rule2 = {
|
|
312
|
+
id: 'conflict-deny',
|
|
313
|
+
name: 'Deny API Calls',
|
|
314
|
+
type: 'security',
|
|
315
|
+
enabled: true,
|
|
316
|
+
priority: 500,
|
|
317
|
+
conditions: [
|
|
318
|
+
{ field: 'actionCategory', operator: 'equals', value: 'external_api' }
|
|
319
|
+
],
|
|
320
|
+
conditionLogic: 'all',
|
|
321
|
+
actions: [{ type: 'deny' }],
|
|
322
|
+
riskWeight: 50
|
|
323
|
+
};
|
|
324
|
+
const conflictResult = checkForConflicts([rule1, rule2]);
|
|
325
|
+
console.log('\nConflict detection:');
|
|
326
|
+
console.log(` Has conflicts: ${conflictResult.hasConflicts}`);
|
|
327
|
+
for (const conflict of conflictResult.conflicts) {
|
|
328
|
+
console.log(` - ${conflict.conflictType}: ${conflict.description}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Example: Linting rules for best practices
|
|
333
|
+
*/
|
|
334
|
+
export function demonstrateLinting() {
|
|
335
|
+
const rules = [
|
|
336
|
+
examplePiiAccessRule,
|
|
337
|
+
exampleProductionDeployRule,
|
|
338
|
+
exampleLargeDataWarningRule,
|
|
339
|
+
exampleAuthCheckRule,
|
|
340
|
+
exampleApiCallRule
|
|
341
|
+
];
|
|
342
|
+
const lintResult = lintRules(rules);
|
|
343
|
+
console.log('\nLint results:');
|
|
344
|
+
console.log(` Total issues: ${lintResult.totalIssues}`);
|
|
345
|
+
console.log(` Errors: ${lintResult.errors.length}`);
|
|
346
|
+
console.log(` Warnings: ${lintResult.warnings.length}`);
|
|
347
|
+
console.log(` Suggestions: ${lintResult.suggestions.length}`);
|
|
348
|
+
for (const error of lintResult.errors) {
|
|
349
|
+
console.log(` [ERROR] ${error.ruleId}: ${error.message}`);
|
|
350
|
+
}
|
|
351
|
+
for (const warning of lintResult.warnings) {
|
|
352
|
+
console.log(` [WARN] ${warning.ruleId}: ${warning.message}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// ============================================================================
|
|
356
|
+
// RUN ALL EXAMPLES
|
|
357
|
+
// ============================================================================
|
|
358
|
+
/**
|
|
359
|
+
* Run all examples to demonstrate the testing framework
|
|
360
|
+
*/
|
|
361
|
+
export function runAllExamples() {
|
|
362
|
+
console.log('=== Rule Testing Framework Examples ===\n');
|
|
363
|
+
console.log('--- Test Case Examples ---');
|
|
364
|
+
runPiiAccessRuleTests();
|
|
365
|
+
runProductionDeployTests();
|
|
366
|
+
runLargeDataWarningTests();
|
|
367
|
+
console.log('\n--- Assertion Helpers ---');
|
|
368
|
+
demonstrateAssertions();
|
|
369
|
+
console.log('\n--- Validation Examples ---');
|
|
370
|
+
demonstrateValidation();
|
|
371
|
+
demonstrateConflictDetection();
|
|
372
|
+
demonstrateLinting();
|
|
373
|
+
console.log('\n=== Examples Complete ===');
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=rule-tester.examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-tester.examples.js","sourceRoot":"","sources":["../../src/testing/rule-tester.examples.ts"],"names":[],"mappings":"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"}
|