@trentapps/manager-protocol 1.1.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/LICENSE +21 -0
- package/README.md +446 -0
- package/dist/analyzers/ArchitectureDetector.d.ts +44 -0
- package/dist/analyzers/ArchitectureDetector.d.ts.map +1 -0
- package/dist/analyzers/ArchitectureDetector.js +218 -0
- package/dist/analyzers/ArchitectureDetector.js.map +1 -0
- package/dist/analyzers/CSSAnalyzer.d.ts +104 -0
- package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -0
- package/dist/analyzers/CSSAnalyzer.js +578 -0
- package/dist/analyzers/CSSAnalyzer.js.map +1 -0
- package/dist/analyzers/index.d.ts +5 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +5 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +174 -0
- package/dist/cli.js.map +1 -0
- package/dist/design-system/index.d.ts +6 -0
- package/dist/design-system/index.d.ts.map +1 -0
- package/dist/design-system/index.js +6 -0
- package/dist/design-system/index.js.map +1 -0
- package/dist/design-system/tokens.d.ts +106 -0
- package/dist/design-system/tokens.d.ts.map +1 -0
- package/dist/design-system/tokens.js +554 -0
- package/dist/design-system/tokens.js.map +1 -0
- package/dist/engine/AppMonitor.d.ts +162 -0
- package/dist/engine/AppMonitor.d.ts.map +1 -0
- package/dist/engine/AppMonitor.js +754 -0
- package/dist/engine/AppMonitor.js.map +1 -0
- package/dist/engine/AuditLogger.d.ts +138 -0
- package/dist/engine/AuditLogger.d.ts.map +1 -0
- package/dist/engine/AuditLogger.js +448 -0
- package/dist/engine/AuditLogger.js.map +1 -0
- package/dist/engine/GitHubApprovalManager.d.ts +106 -0
- package/dist/engine/GitHubApprovalManager.d.ts.map +1 -0
- package/dist/engine/GitHubApprovalManager.js +315 -0
- package/dist/engine/GitHubApprovalManager.js.map +1 -0
- package/dist/engine/RateLimiter.d.ts +79 -0
- package/dist/engine/RateLimiter.d.ts.map +1 -0
- package/dist/engine/RateLimiter.js +232 -0
- package/dist/engine/RateLimiter.js.map +1 -0
- package/dist/engine/RulesEngine.d.ts +77 -0
- package/dist/engine/RulesEngine.d.ts.map +1 -0
- package/dist/engine/RulesEngine.js +400 -0
- package/dist/engine/RulesEngine.js.map +1 -0
- package/dist/engine/TaskManager.d.ts +173 -0
- package/dist/engine/TaskManager.d.ts.map +1 -0
- package/dist/engine/TaskManager.js +678 -0
- package/dist/engine/TaskManager.js.map +1 -0
- package/dist/engine/index.d.ts +9 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +9 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/architecture.d.ts +9 -0
- package/dist/rules/architecture.d.ts.map +1 -0
- package/dist/rules/architecture.js +322 -0
- package/dist/rules/architecture.js.map +1 -0
- package/dist/rules/azure.d.ts +7 -0
- package/dist/rules/azure.d.ts.map +1 -0
- package/dist/rules/azure.js +138 -0
- package/dist/rules/azure.js.map +1 -0
- package/dist/rules/compliance.d.ts +9 -0
- package/dist/rules/compliance.d.ts.map +1 -0
- package/dist/rules/compliance.js +304 -0
- package/dist/rules/compliance.js.map +1 -0
- package/dist/rules/css.d.ts +10 -0
- package/dist/rules/css.d.ts.map +1 -0
- package/dist/rules/css.js +1239 -0
- package/dist/rules/css.js.map +1 -0
- package/dist/rules/flask.d.ts +7 -0
- package/dist/rules/flask.d.ts.map +1 -0
- package/dist/rules/flask.js +155 -0
- package/dist/rules/flask.js.map +1 -0
- package/dist/rules/index.d.ts +607 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +401 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/ml-ai.d.ts +7 -0
- package/dist/rules/ml-ai.d.ts.map +1 -0
- package/dist/rules/ml-ai.js +150 -0
- package/dist/rules/ml-ai.js.map +1 -0
- package/dist/rules/operational.d.ts +9 -0
- package/dist/rules/operational.d.ts.map +1 -0
- package/dist/rules/operational.js +318 -0
- package/dist/rules/operational.js.map +1 -0
- package/dist/rules/security.d.ts +9 -0
- package/dist/rules/security.d.ts.map +1 -0
- package/dist/rules/security.js +287 -0
- package/dist/rules/security.js.map +1 -0
- package/dist/rules/storage.d.ts +7 -0
- package/dist/rules/storage.d.ts.map +1 -0
- package/dist/rules/storage.js +134 -0
- package/dist/rules/storage.js.map +1 -0
- package/dist/rules/stripe.d.ts +7 -0
- package/dist/rules/stripe.d.ts.map +1 -0
- package/dist/rules/stripe.js +140 -0
- package/dist/rules/stripe.js.map +1 -0
- package/dist/rules/testing.d.ts +7 -0
- package/dist/rules/testing.d.ts.map +1 -0
- package/dist/rules/testing.js +135 -0
- package/dist/rules/testing.js.map +1 -0
- package/dist/rules/ux.d.ts +9 -0
- package/dist/rules/ux.d.ts.map +1 -0
- package/dist/rules/ux.js +280 -0
- package/dist/rules/ux.js.map +1 -0
- package/dist/rules/websocket.d.ts +7 -0
- package/dist/rules/websocket.d.ts.map +1 -0
- package/dist/rules/websocket.js +136 -0
- package/dist/rules/websocket.js.map +1 -0
- package/dist/server.d.ts +49 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2330 -0
- package/dist/server.js.map +1 -0
- package/dist/supervisor/AgentSupervisor.d.ts +235 -0
- package/dist/supervisor/AgentSupervisor.d.ts.map +1 -0
- package/dist/supervisor/AgentSupervisor.js +596 -0
- package/dist/supervisor/AgentSupervisor.js.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts +48 -0
- package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -0
- package/dist/supervisor/ManagedServerRegistry.js +145 -0
- package/dist/supervisor/ManagedServerRegistry.js.map +1 -0
- package/dist/supervisor/ProjectTracker.d.ts +188 -0
- package/dist/supervisor/ProjectTracker.d.ts.map +1 -0
- package/dist/supervisor/ProjectTracker.js +617 -0
- package/dist/supervisor/ProjectTracker.js.map +1 -0
- package/dist/supervisor/index.d.ts +6 -0
- package/dist/supervisor/index.d.ts.map +1 -0
- package/dist/supervisor/index.js +6 -0
- package/dist/supervisor/index.js.map +1 -0
- package/dist/types/index.d.ts +1176 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +391 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/errors.d.ts +86 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +171 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/shell.d.ts +22 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +29 -0
- package/dist/utils/shell.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Rules Engine Core
|
|
3
|
+
*
|
|
4
|
+
* The heart of the governance system that evaluates actions against business rules.
|
|
5
|
+
*/
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
+
export class RulesEngine {
|
|
8
|
+
rules = new Map();
|
|
9
|
+
customEvaluators = new Map();
|
|
10
|
+
constructor() {
|
|
11
|
+
this.registerDefaultEvaluators();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Register a business rule
|
|
15
|
+
*/
|
|
16
|
+
registerRule(rule) {
|
|
17
|
+
this.rules.set(rule.id, rule);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register multiple business rules
|
|
21
|
+
*/
|
|
22
|
+
registerRules(rules) {
|
|
23
|
+
for (const rule of rules) {
|
|
24
|
+
this.registerRule(rule);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Unregister a rule by ID
|
|
29
|
+
*/
|
|
30
|
+
unregisterRule(ruleId) {
|
|
31
|
+
return this.rules.delete(ruleId);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all registered rules
|
|
35
|
+
*/
|
|
36
|
+
getRules() {
|
|
37
|
+
return Array.from(this.rules.values());
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get enabled rules sorted by priority (higher priority first)
|
|
41
|
+
*/
|
|
42
|
+
getActiveRules() {
|
|
43
|
+
return this.getRules()
|
|
44
|
+
.filter(rule => rule.enabled)
|
|
45
|
+
.sort((a, b) => b.priority - a.priority);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register a custom condition evaluator
|
|
49
|
+
*/
|
|
50
|
+
registerCustomEvaluator(name, evaluator) {
|
|
51
|
+
this.customEvaluators.set(name, evaluator);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Evaluate an agent action against all active rules
|
|
55
|
+
*/
|
|
56
|
+
evaluateAction(action, context) {
|
|
57
|
+
const actionId = action.id || uuidv4();
|
|
58
|
+
const violations = [];
|
|
59
|
+
const warnings = [];
|
|
60
|
+
const appliedRules = [];
|
|
61
|
+
let totalRiskWeight = 0;
|
|
62
|
+
let requiresHumanApproval = false;
|
|
63
|
+
let approvalReason;
|
|
64
|
+
let isDenied = false;
|
|
65
|
+
let isRateLimited = false;
|
|
66
|
+
// Build evaluation context
|
|
67
|
+
const evalContext = this.buildEvaluationContext(action, context);
|
|
68
|
+
// Get active rules and evaluate
|
|
69
|
+
const activeRules = this.getActiveRules();
|
|
70
|
+
for (const rule of activeRules) {
|
|
71
|
+
const ruleMatches = this.evaluateRuleConditions(rule, evalContext);
|
|
72
|
+
if (ruleMatches) {
|
|
73
|
+
appliedRules.push(rule.id);
|
|
74
|
+
totalRiskWeight += rule.riskWeight;
|
|
75
|
+
// Process rule actions
|
|
76
|
+
for (const ruleAction of rule.actions) {
|
|
77
|
+
switch (ruleAction.type) {
|
|
78
|
+
case 'deny':
|
|
79
|
+
isDenied = true;
|
|
80
|
+
violations.push({
|
|
81
|
+
ruleId: rule.id,
|
|
82
|
+
ruleName: rule.name,
|
|
83
|
+
severity: this.getRuleSeverity(rule),
|
|
84
|
+
message: ruleAction.message || `Action denied by rule: ${rule.name}`,
|
|
85
|
+
recommendation: this.getRecommendation(rule, ruleAction)
|
|
86
|
+
});
|
|
87
|
+
break;
|
|
88
|
+
case 'require_approval':
|
|
89
|
+
requiresHumanApproval = true;
|
|
90
|
+
approvalReason = ruleAction.message || `Requires approval due to rule: ${rule.name}`;
|
|
91
|
+
break;
|
|
92
|
+
case 'warn':
|
|
93
|
+
warnings.push(ruleAction.message || `Warning from rule: ${rule.name}`);
|
|
94
|
+
break;
|
|
95
|
+
case 'rate_limit':
|
|
96
|
+
isRateLimited = true;
|
|
97
|
+
break;
|
|
98
|
+
case 'escalate':
|
|
99
|
+
requiresHumanApproval = true;
|
|
100
|
+
approvalReason = `Escalated: ${ruleAction.message || rule.name}`;
|
|
101
|
+
break;
|
|
102
|
+
default:
|
|
103
|
+
// Allow, log, transform, notify - don't affect approval status
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Calculate risk score (0-100)
|
|
110
|
+
const riskScore = Math.min(100, totalRiskWeight);
|
|
111
|
+
const riskLevel = this.calculateRiskLevel(riskScore);
|
|
112
|
+
// Determine final status
|
|
113
|
+
let status;
|
|
114
|
+
if (isDenied) {
|
|
115
|
+
status = 'denied';
|
|
116
|
+
}
|
|
117
|
+
else if (isRateLimited) {
|
|
118
|
+
status = 'rate_limited';
|
|
119
|
+
}
|
|
120
|
+
else if (requiresHumanApproval) {
|
|
121
|
+
status = 'pending_approval';
|
|
122
|
+
}
|
|
123
|
+
else if (warnings.length > 0) {
|
|
124
|
+
status = 'requires_review';
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
status = 'approved';
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
actionId,
|
|
131
|
+
status,
|
|
132
|
+
riskScore,
|
|
133
|
+
riskLevel,
|
|
134
|
+
allowed: !isDenied && !isRateLimited,
|
|
135
|
+
violations,
|
|
136
|
+
warnings,
|
|
137
|
+
appliedRules,
|
|
138
|
+
requiresHumanApproval,
|
|
139
|
+
approvalReason,
|
|
140
|
+
rateLimitInfo: isRateLimited ? { limited: true } : undefined,
|
|
141
|
+
evaluatedAt: new Date().toISOString(),
|
|
142
|
+
metadata: {
|
|
143
|
+
action: action.name,
|
|
144
|
+
category: action.category,
|
|
145
|
+
rulesEvaluated: activeRules.length
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Apply business rules to a context and return recommendations
|
|
151
|
+
*/
|
|
152
|
+
applyBusinessRules(context) {
|
|
153
|
+
const contextId = uuidv4();
|
|
154
|
+
const rulesApplied = [];
|
|
155
|
+
const recommendations = [];
|
|
156
|
+
const constraints = [];
|
|
157
|
+
let totalRiskScore = 0;
|
|
158
|
+
const evalContext = context.customAttributes || {};
|
|
159
|
+
const activeRules = this.getActiveRules();
|
|
160
|
+
for (const rule of activeRules) {
|
|
161
|
+
const matched = this.evaluateRuleConditions(rule, {
|
|
162
|
+
...evalContext,
|
|
163
|
+
environment: context.environment,
|
|
164
|
+
userRole: context.userRole,
|
|
165
|
+
dataClassification: context.dataClassification,
|
|
166
|
+
department: context.department
|
|
167
|
+
});
|
|
168
|
+
rulesApplied.push({
|
|
169
|
+
ruleId: rule.id,
|
|
170
|
+
ruleName: rule.name,
|
|
171
|
+
matched,
|
|
172
|
+
actions: matched ? rule.actions : []
|
|
173
|
+
});
|
|
174
|
+
if (matched) {
|
|
175
|
+
totalRiskScore += rule.riskWeight;
|
|
176
|
+
// Generate recommendations and constraints
|
|
177
|
+
for (const action of rule.actions) {
|
|
178
|
+
if (action.type === 'deny') {
|
|
179
|
+
constraints.push({
|
|
180
|
+
type: 'prohibition',
|
|
181
|
+
description: action.message || `Prohibited by ${rule.name}`,
|
|
182
|
+
enforced: true
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
else if (action.type === 'require_approval') {
|
|
186
|
+
constraints.push({
|
|
187
|
+
type: 'approval_required',
|
|
188
|
+
description: action.message || `Requires approval per ${rule.name}`,
|
|
189
|
+
enforced: true
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (action.type === 'warn') {
|
|
193
|
+
recommendations.push(action.message || `Consider: ${rule.name}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
contextId,
|
|
200
|
+
rulesApplied,
|
|
201
|
+
aggregateRiskScore: Math.min(100, totalRiskScore),
|
|
202
|
+
recommendations,
|
|
203
|
+
constraints,
|
|
204
|
+
processedAt: new Date().toISOString()
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Build evaluation context from action and business context
|
|
209
|
+
*/
|
|
210
|
+
buildEvaluationContext(action, context) {
|
|
211
|
+
return {
|
|
212
|
+
// Action fields
|
|
213
|
+
actionName: action.name,
|
|
214
|
+
actionCategory: action.category,
|
|
215
|
+
actionDescription: action.description,
|
|
216
|
+
...action.parameters,
|
|
217
|
+
...action.metadata,
|
|
218
|
+
// Context fields
|
|
219
|
+
environment: context?.environment,
|
|
220
|
+
agentId: context?.agentId || action.agentId,
|
|
221
|
+
agentType: context?.agentType,
|
|
222
|
+
userId: context?.userId,
|
|
223
|
+
userRole: context?.userRole,
|
|
224
|
+
sessionId: context?.sessionId || action.sessionId,
|
|
225
|
+
organizationId: context?.organizationId,
|
|
226
|
+
department: context?.department,
|
|
227
|
+
costCenter: context?.costCenter,
|
|
228
|
+
dataClassification: context?.dataClassification,
|
|
229
|
+
complianceFrameworks: context?.complianceFrameworks,
|
|
230
|
+
...context?.customAttributes
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Evaluate if all/any conditions of a rule match
|
|
235
|
+
*/
|
|
236
|
+
evaluateRuleConditions(rule, context) {
|
|
237
|
+
if (rule.conditions.length === 0) {
|
|
238
|
+
return true; // No conditions means always match
|
|
239
|
+
}
|
|
240
|
+
const results = rule.conditions.map(condition => this.evaluateCondition(condition, context));
|
|
241
|
+
if (rule.conditionLogic === 'any') {
|
|
242
|
+
return results.some(r => r);
|
|
243
|
+
}
|
|
244
|
+
return results.every(r => r);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Evaluate a single condition
|
|
248
|
+
*/
|
|
249
|
+
evaluateCondition(condition, context) {
|
|
250
|
+
const fieldValue = this.getNestedValue(context, condition.field);
|
|
251
|
+
switch (condition.operator) {
|
|
252
|
+
case 'equals':
|
|
253
|
+
return fieldValue === condition.value;
|
|
254
|
+
case 'not_equals':
|
|
255
|
+
return fieldValue !== condition.value;
|
|
256
|
+
case 'contains':
|
|
257
|
+
if (typeof fieldValue === 'string' && typeof condition.value === 'string') {
|
|
258
|
+
return fieldValue.includes(condition.value);
|
|
259
|
+
}
|
|
260
|
+
if (Array.isArray(fieldValue)) {
|
|
261
|
+
return fieldValue.includes(condition.value);
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
case 'not_contains':
|
|
265
|
+
if (typeof fieldValue === 'string' && typeof condition.value === 'string') {
|
|
266
|
+
return !fieldValue.includes(condition.value);
|
|
267
|
+
}
|
|
268
|
+
if (Array.isArray(fieldValue)) {
|
|
269
|
+
return !fieldValue.includes(condition.value);
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
case 'greater_than':
|
|
273
|
+
return typeof fieldValue === 'number' && typeof condition.value === 'number'
|
|
274
|
+
&& fieldValue > condition.value;
|
|
275
|
+
case 'less_than':
|
|
276
|
+
return typeof fieldValue === 'number' && typeof condition.value === 'number'
|
|
277
|
+
&& fieldValue < condition.value;
|
|
278
|
+
case 'in':
|
|
279
|
+
if (Array.isArray(condition.value)) {
|
|
280
|
+
return condition.value.includes(fieldValue);
|
|
281
|
+
}
|
|
282
|
+
return false;
|
|
283
|
+
case 'not_in':
|
|
284
|
+
if (Array.isArray(condition.value)) {
|
|
285
|
+
return !condition.value.includes(fieldValue);
|
|
286
|
+
}
|
|
287
|
+
return true;
|
|
288
|
+
case 'matches_regex':
|
|
289
|
+
if (typeof fieldValue === 'string' && typeof condition.value === 'string') {
|
|
290
|
+
try {
|
|
291
|
+
const regex = new RegExp(condition.value);
|
|
292
|
+
return regex.test(fieldValue);
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return false;
|
|
299
|
+
case 'exists':
|
|
300
|
+
return fieldValue !== undefined && fieldValue !== null;
|
|
301
|
+
case 'not_exists':
|
|
302
|
+
return fieldValue === undefined || fieldValue === null;
|
|
303
|
+
case 'custom':
|
|
304
|
+
if (condition.customEvaluator) {
|
|
305
|
+
const evaluator = this.customEvaluators.get(condition.customEvaluator);
|
|
306
|
+
if (evaluator) {
|
|
307
|
+
return evaluator(context, condition);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
default:
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get nested value from object using dot notation
|
|
317
|
+
*/
|
|
318
|
+
getNestedValue(obj, path) {
|
|
319
|
+
return path.split('.').reduce((current, key) => {
|
|
320
|
+
if (current && typeof current === 'object' && key in current) {
|
|
321
|
+
return current[key];
|
|
322
|
+
}
|
|
323
|
+
return undefined;
|
|
324
|
+
}, obj);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Calculate risk level from score
|
|
328
|
+
*/
|
|
329
|
+
calculateRiskLevel(score) {
|
|
330
|
+
if (score >= 80)
|
|
331
|
+
return 'critical';
|
|
332
|
+
if (score >= 60)
|
|
333
|
+
return 'high';
|
|
334
|
+
if (score >= 40)
|
|
335
|
+
return 'medium';
|
|
336
|
+
if (score >= 20)
|
|
337
|
+
return 'low';
|
|
338
|
+
return 'minimal';
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Get severity level from a rule
|
|
342
|
+
*/
|
|
343
|
+
getRuleSeverity(rule) {
|
|
344
|
+
if (rule.riskWeight >= 40)
|
|
345
|
+
return 'critical';
|
|
346
|
+
if (rule.riskWeight >= 30)
|
|
347
|
+
return 'high';
|
|
348
|
+
if (rule.riskWeight >= 20)
|
|
349
|
+
return 'medium';
|
|
350
|
+
if (rule.riskWeight >= 10)
|
|
351
|
+
return 'low';
|
|
352
|
+
return 'minimal';
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Generate recommendation based on rule and action
|
|
356
|
+
*/
|
|
357
|
+
getRecommendation(rule, action) {
|
|
358
|
+
const baseRecs = {
|
|
359
|
+
compliance: 'Review compliance requirements and ensure proper authorization',
|
|
360
|
+
security: 'Consult with security team before proceeding',
|
|
361
|
+
operational: 'Follow standard operating procedures',
|
|
362
|
+
financial: 'Obtain financial approval before proceeding',
|
|
363
|
+
ux: 'Review UX guidelines and user impact',
|
|
364
|
+
architecture: 'Consult architecture review board',
|
|
365
|
+
data_governance: 'Ensure data handling complies with policies',
|
|
366
|
+
rate_limit: 'Reduce request frequency or request limit increase',
|
|
367
|
+
custom: 'Review custom policy requirements'
|
|
368
|
+
};
|
|
369
|
+
return action.params?.recommendation
|
|
370
|
+
|| baseRecs[rule.type]
|
|
371
|
+
|| 'Review policy and obtain necessary approvals';
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Register default custom evaluators
|
|
375
|
+
*/
|
|
376
|
+
registerDefaultEvaluators() {
|
|
377
|
+
// Time-based evaluator
|
|
378
|
+
this.registerCustomEvaluator('businessHours', (_context) => {
|
|
379
|
+
const hour = new Date().getHours();
|
|
380
|
+
return hour >= 9 && hour < 17;
|
|
381
|
+
});
|
|
382
|
+
// Weekday evaluator
|
|
383
|
+
this.registerCustomEvaluator('weekday', (_context) => {
|
|
384
|
+
const day = new Date().getDay();
|
|
385
|
+
return day >= 1 && day <= 5;
|
|
386
|
+
});
|
|
387
|
+
// Production environment evaluator
|
|
388
|
+
this.registerCustomEvaluator('isProduction', (context) => {
|
|
389
|
+
return context.environment === 'production';
|
|
390
|
+
});
|
|
391
|
+
// High privilege evaluator
|
|
392
|
+
this.registerCustomEvaluator('isHighPrivilege', (context) => {
|
|
393
|
+
const highPrivRoles = ['admin', 'superuser', 'root', 'system'];
|
|
394
|
+
return highPrivRoles.includes(context.userRole);
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// Export singleton instance
|
|
399
|
+
export const rulesEngine = new RulesEngine();
|
|
400
|
+
//# sourceMappingURL=RulesEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RulesEngine.js","sourceRoot":"","sources":["../../src/engine/RulesEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Agent Supervisor - Task Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages project tasks using GitHub Issues via the `gh` CLI.
|
|
5
|
+
* Tasks are stored as GitHub Issues, providing persistence and visibility.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Auto-detects repo from current directory if not specified
|
|
9
|
+
* - Creates priority/status labels automatically
|
|
10
|
+
* - Caches repo detection for performance
|
|
11
|
+
* - Full GitHub Issues integration
|
|
12
|
+
*/
|
|
13
|
+
import type { ProjectTask, TaskPriority, TaskStatus } from '../types/index.js';
|
|
14
|
+
export interface TaskManagerOptions {
|
|
15
|
+
defaultLabels?: string[];
|
|
16
|
+
priorityLabelPrefix?: string;
|
|
17
|
+
statusLabelPrefix?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class TaskManager {
|
|
20
|
+
private priorityPrefix;
|
|
21
|
+
private statusPrefix;
|
|
22
|
+
private cachedRepo;
|
|
23
|
+
private initializedLabels;
|
|
24
|
+
private ghVerified;
|
|
25
|
+
constructor(options?: TaskManagerOptions);
|
|
26
|
+
/**
|
|
27
|
+
* Verify gh CLI is installed and authenticated
|
|
28
|
+
*/
|
|
29
|
+
verifyGh(): Promise<{
|
|
30
|
+
ok: boolean;
|
|
31
|
+
error?: string;
|
|
32
|
+
user?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the current repo from git remote or gh CLI
|
|
36
|
+
*/
|
|
37
|
+
getCurrentRepo(): Promise<string | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Resolve project name - use provided or auto-detect
|
|
40
|
+
*/
|
|
41
|
+
private resolveRepo;
|
|
42
|
+
/**
|
|
43
|
+
* Execute a gh command and return parsed JSON output
|
|
44
|
+
*/
|
|
45
|
+
private execGh;
|
|
46
|
+
/**
|
|
47
|
+
* Execute a gh command without JSON output
|
|
48
|
+
*/
|
|
49
|
+
private execGhRaw;
|
|
50
|
+
/**
|
|
51
|
+
* Ensure a label exists in the repo, create if not
|
|
52
|
+
*/
|
|
53
|
+
private ensureLabel;
|
|
54
|
+
/**
|
|
55
|
+
* Convert GitHub Issue to ProjectTask
|
|
56
|
+
*/
|
|
57
|
+
private issueToTask;
|
|
58
|
+
/**
|
|
59
|
+
* Build labels array for gh command
|
|
60
|
+
*/
|
|
61
|
+
private buildLabels;
|
|
62
|
+
/**
|
|
63
|
+
* Create a new task (GitHub Issue) for a project
|
|
64
|
+
*
|
|
65
|
+
* @param params.projectName - Optional repo in "owner/repo" format. Auto-detects if not provided.
|
|
66
|
+
* @param params.needsApproval - Flag for significant changes requiring approval before implementation
|
|
67
|
+
*/
|
|
68
|
+
createTask(params: {
|
|
69
|
+
projectName?: string;
|
|
70
|
+
title: string;
|
|
71
|
+
description?: string;
|
|
72
|
+
priority?: TaskPriority;
|
|
73
|
+
assignee?: string;
|
|
74
|
+
labels?: string[];
|
|
75
|
+
dueDate?: string;
|
|
76
|
+
estimatedHours?: number;
|
|
77
|
+
parentTaskId?: string;
|
|
78
|
+
dependencies?: string[];
|
|
79
|
+
metadata?: Record<string, unknown>;
|
|
80
|
+
needsApproval?: boolean;
|
|
81
|
+
}): Promise<ProjectTask>;
|
|
82
|
+
/**
|
|
83
|
+
* Get all tasks for a project
|
|
84
|
+
*/
|
|
85
|
+
getTasksByProject(projectName?: string, filter?: {
|
|
86
|
+
status?: TaskStatus;
|
|
87
|
+
priority?: TaskPriority;
|
|
88
|
+
assignee?: string;
|
|
89
|
+
labels?: string[];
|
|
90
|
+
}): Promise<ProjectTask[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Get pending tasks for a project
|
|
93
|
+
*/
|
|
94
|
+
getPendingTasks(projectName?: string): Promise<ProjectTask[]>;
|
|
95
|
+
/**
|
|
96
|
+
* Get in-progress tasks
|
|
97
|
+
*/
|
|
98
|
+
getInProgressTasks(projectName?: string): Promise<ProjectTask[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Get a specific task by ID (issue number)
|
|
101
|
+
*/
|
|
102
|
+
getTask(projectName: string | undefined, taskId: string): Promise<ProjectTask | null>;
|
|
103
|
+
/**
|
|
104
|
+
* Update a task
|
|
105
|
+
*/
|
|
106
|
+
updateTask(projectName: string | undefined, taskId: string, updates: Partial<Omit<ProjectTask, 'id' | 'projectName' | 'createdAt'>> & {
|
|
107
|
+
comment?: string;
|
|
108
|
+
commits?: string[];
|
|
109
|
+
closeWithComment?: boolean;
|
|
110
|
+
}): Promise<ProjectTask | null>;
|
|
111
|
+
/**
|
|
112
|
+
* Add a comment to a task/issue
|
|
113
|
+
*/
|
|
114
|
+
addComment(projectName: string | undefined, taskId: string, comment?: string, commits?: string[]): Promise<boolean>;
|
|
115
|
+
/**
|
|
116
|
+
* Link commits to a task by adding a comment
|
|
117
|
+
*/
|
|
118
|
+
linkCommits(projectName: string | undefined, taskId: string, commits: string[], message?: string): Promise<boolean>;
|
|
119
|
+
/**
|
|
120
|
+
* Close a task with a resolution comment
|
|
121
|
+
*/
|
|
122
|
+
closeWithComment(projectName: string | undefined, taskId: string, resolution: string, commits?: string[]): Promise<ProjectTask | null>;
|
|
123
|
+
/**
|
|
124
|
+
* Update task status
|
|
125
|
+
*/
|
|
126
|
+
updateTaskStatus(projectName: string | undefined, taskId: string, status: TaskStatus): Promise<ProjectTask | null>;
|
|
127
|
+
/**
|
|
128
|
+
* Start a task (set to in_progress)
|
|
129
|
+
*/
|
|
130
|
+
startTask(projectName: string | undefined, taskId: string): Promise<ProjectTask | null>;
|
|
131
|
+
/**
|
|
132
|
+
* Complete a task
|
|
133
|
+
*/
|
|
134
|
+
completeTask(projectName: string | undefined, taskId: string): Promise<ProjectTask | null>;
|
|
135
|
+
/**
|
|
136
|
+
* Block a task
|
|
137
|
+
*/
|
|
138
|
+
blockTask(projectName: string | undefined, taskId: string, reason?: string): Promise<ProjectTask | null>;
|
|
139
|
+
/**
|
|
140
|
+
* Delete a task (close as "not planned")
|
|
141
|
+
*/
|
|
142
|
+
deleteTask(projectName: string | undefined, taskId: string): Promise<boolean>;
|
|
143
|
+
/**
|
|
144
|
+
* List projects with issues
|
|
145
|
+
*/
|
|
146
|
+
listProjects(): Promise<Array<{
|
|
147
|
+
name: string;
|
|
148
|
+
taskCount: number;
|
|
149
|
+
pendingCount: number;
|
|
150
|
+
inProgressCount: number;
|
|
151
|
+
completedCount: number;
|
|
152
|
+
}>>;
|
|
153
|
+
/**
|
|
154
|
+
* Get task statistics for a project
|
|
155
|
+
*/
|
|
156
|
+
getProjectStats(projectName?: string): Promise<{
|
|
157
|
+
total: number;
|
|
158
|
+
byStatus: Record<string, number>;
|
|
159
|
+
byPriority: Record<string, number>;
|
|
160
|
+
overdue: number;
|
|
161
|
+
completedThisWeek: number;
|
|
162
|
+
} | null>;
|
|
163
|
+
/**
|
|
164
|
+
* Search tasks
|
|
165
|
+
*/
|
|
166
|
+
searchTasks(query: string, projectName?: string): Promise<ProjectTask[]>;
|
|
167
|
+
/**
|
|
168
|
+
* Get count of completed tasks (GitHub doesn't support bulk delete)
|
|
169
|
+
*/
|
|
170
|
+
clearCompletedTasks(projectName?: string): Promise<number>;
|
|
171
|
+
}
|
|
172
|
+
export declare const taskManager: TaskManager;
|
|
173
|
+
//# sourceMappingURL=TaskManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskManager.d.ts","sourceRoot":"","sources":["../../src/engine/TaskManager.ts"],"names":[],"mappings":"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"}
|