@dotsetlabs/tollgate 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/dist/analyzers/filesystem.d.ts +5 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -1
- package/dist/analyzers/filesystem.js +61 -7
- package/dist/analyzers/filesystem.js.map +1 -1
- package/dist/analyzers/loader.d.ts +5 -0
- package/dist/analyzers/loader.d.ts.map +1 -1
- package/dist/analyzers/loader.js +112 -6
- package/dist/analyzers/loader.js.map +1 -1
- package/dist/analyzers/prompt-injection.d.ts +1 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -1
- package/dist/analyzers/prompt-injection.js +48 -2
- package/dist/analyzers/prompt-injection.js.map +1 -1
- package/dist/analyzers/shell.d.ts +8 -0
- package/dist/analyzers/shell.d.ts.map +1 -1
- package/dist/analyzers/shell.js +109 -8
- package/dist/analyzers/shell.js.map +1 -1
- package/dist/analyzers/sql.d.ts.map +1 -1
- package/dist/analyzers/sql.js +8 -7
- package/dist/analyzers/sql.js.map +1 -1
- package/dist/approval/interactive.d.ts +1 -1
- package/dist/approval/interactive.d.ts.map +1 -1
- package/dist/approval/interactive.js +13 -1
- package/dist/approval/interactive.js.map +1 -1
- package/dist/approval/rate-limiter.d.ts +115 -0
- package/dist/approval/rate-limiter.d.ts.map +1 -0
- package/dist/approval/rate-limiter.js +200 -0
- package/dist/approval/rate-limiter.js.map +1 -0
- package/dist/approval/url-validator.d.ts +51 -0
- package/dist/approval/url-validator.d.ts.map +1 -0
- package/dist/approval/url-validator.js +184 -0
- package/dist/approval/url-validator.js.map +1 -0
- package/dist/approval/webhook.d.ts +48 -0
- package/dist/approval/webhook.d.ts.map +1 -1
- package/dist/approval/webhook.js +89 -0
- package/dist/approval/webhook.js.map +1 -1
- package/dist/audit/integrity.d.ts +107 -0
- package/dist/audit/integrity.d.ts.map +1 -0
- package/dist/audit/integrity.js +191 -0
- package/dist/audit/integrity.js.map +1 -0
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +6 -5
- package/dist/audit/logger.js.map +1 -1
- package/dist/audit/redaction.js +6 -4
- package/dist/audit/redaction.js.map +1 -1
- package/dist/cli/commands/guard.d.ts +97 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +456 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -1
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/input-validation.d.ts +83 -0
- package/dist/cli/input-validation.d.ts.map +1 -0
- package/dist/cli/input-validation.js +237 -0
- package/dist/cli/input-validation.js.map +1 -0
- package/dist/cli/ui.js +2 -2
- package/dist/cli/ui.js.map +1 -1
- package/dist/guard/alternatives/index.d.ts +68 -0
- package/dist/guard/alternatives/index.d.ts.map +1 -0
- package/dist/guard/alternatives/index.js +224 -0
- package/dist/guard/alternatives/index.js.map +1 -0
- package/dist/guard/alternatives/registry.d.ts +16 -0
- package/dist/guard/alternatives/registry.d.ts.map +1 -0
- package/dist/guard/alternatives/registry.js +518 -0
- package/dist/guard/alternatives/registry.js.map +1 -0
- package/dist/guard/alternatives/types.d.ts +86 -0
- package/dist/guard/alternatives/types.d.ts.map +1 -0
- package/dist/guard/alternatives/types.js +5 -0
- package/dist/guard/alternatives/types.js.map +1 -0
- package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
- package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
- package/dist/guard/approval/enhanced-terminal.js +387 -0
- package/dist/guard/approval/enhanced-terminal.js.map +1 -0
- package/dist/guard/config.d.ts +80 -0
- package/dist/guard/config.d.ts.map +1 -0
- package/dist/guard/config.js +260 -0
- package/dist/guard/config.js.map +1 -0
- package/dist/guard/context/directory.d.ts +35 -0
- package/dist/guard/context/directory.d.ts.map +1 -0
- package/dist/guard/context/directory.js +243 -0
- package/dist/guard/context/directory.js.map +1 -0
- package/dist/guard/context/environment.d.ts +31 -0
- package/dist/guard/context/environment.d.ts.map +1 -0
- package/dist/guard/context/environment.js +204 -0
- package/dist/guard/context/environment.js.map +1 -0
- package/dist/guard/context/git.d.ts +52 -0
- package/dist/guard/context/git.d.ts.map +1 -0
- package/dist/guard/context/git.js +278 -0
- package/dist/guard/context/git.js.map +1 -0
- package/dist/guard/context/index.d.ts +64 -0
- package/dist/guard/context/index.d.ts.map +1 -0
- package/dist/guard/context/index.js +227 -0
- package/dist/guard/context/index.js.map +1 -0
- package/dist/guard/context/project.d.ts +47 -0
- package/dist/guard/context/project.d.ts.map +1 -0
- package/dist/guard/context/project.js +281 -0
- package/dist/guard/context/project.js.map +1 -0
- package/dist/guard/context/types.d.ts +152 -0
- package/dist/guard/context/types.d.ts.map +1 -0
- package/dist/guard/context/types.js +7 -0
- package/dist/guard/context/types.js.map +1 -0
- package/dist/guard/engine.d.ts +107 -0
- package/dist/guard/engine.d.ts.map +1 -0
- package/dist/guard/engine.js +430 -0
- package/dist/guard/engine.js.map +1 -0
- package/dist/guard/enhanced-engine.d.ts +151 -0
- package/dist/guard/enhanced-engine.d.ts.map +1 -0
- package/dist/guard/enhanced-engine.js +622 -0
- package/dist/guard/enhanced-engine.js.map +1 -0
- package/dist/guard/hooks/index.d.ts +50 -0
- package/dist/guard/hooks/index.d.ts.map +1 -0
- package/dist/guard/hooks/index.js +325 -0
- package/dist/guard/hooks/index.js.map +1 -0
- package/dist/guard/index.d.ts +29 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +31 -0
- package/dist/guard/index.js.map +1 -0
- package/dist/guard/learning/index.d.ts +136 -0
- package/dist/guard/learning/index.d.ts.map +1 -0
- package/dist/guard/learning/index.js +314 -0
- package/dist/guard/learning/index.js.map +1 -0
- package/dist/guard/learning/pattern-extractor.d.ts +50 -0
- package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/guard/learning/pattern-extractor.js +372 -0
- package/dist/guard/learning/pattern-extractor.js.map +1 -0
- package/dist/guard/learning/rule-suggester.d.ts +67 -0
- package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
- package/dist/guard/learning/rule-suggester.js +345 -0
- package/dist/guard/learning/rule-suggester.js.map +1 -0
- package/dist/guard/learning/types.d.ts +211 -0
- package/dist/guard/learning/types.d.ts.map +1 -0
- package/dist/guard/learning/types.js +18 -0
- package/dist/guard/learning/types.js.map +1 -0
- package/dist/guard/preview/effects.d.ts +15 -0
- package/dist/guard/preview/effects.d.ts.map +1 -0
- package/dist/guard/preview/effects.js +413 -0
- package/dist/guard/preview/effects.js.map +1 -0
- package/dist/guard/preview/index.d.ts +49 -0
- package/dist/guard/preview/index.d.ts.map +1 -0
- package/dist/guard/preview/index.js +196 -0
- package/dist/guard/preview/index.js.map +1 -0
- package/dist/guard/preview/parser.d.ts +34 -0
- package/dist/guard/preview/parser.d.ts.map +1 -0
- package/dist/guard/preview/parser.js +292 -0
- package/dist/guard/preview/parser.js.map +1 -0
- package/dist/guard/preview/types.d.ts +140 -0
- package/dist/guard/preview/types.d.ts.map +1 -0
- package/dist/guard/preview/types.js +5 -0
- package/dist/guard/preview/types.js.map +1 -0
- package/dist/guard/reversibility/index.d.ts +88 -0
- package/dist/guard/reversibility/index.d.ts.map +1 -0
- package/dist/guard/reversibility/index.js +310 -0
- package/dist/guard/reversibility/index.js.map +1 -0
- package/dist/guard/types.d.ts +192 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +8 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/manager.d.ts.map +1 -1
- package/dist/orchestrator/manager.js +6 -1
- package/dist/orchestrator/manager.js.map +1 -1
- package/dist/policy/engine.d.ts.map +1 -1
- package/dist/policy/engine.js +11 -3
- package/dist/policy/engine.js.map +1 -1
- package/dist/policy/parser.d.ts.map +1 -1
- package/dist/policy/parser.js +3 -0
- package/dist/policy/parser.js.map +1 -1
- package/dist/proxy/server.d.ts.map +1 -1
- package/dist/proxy/server.js +8 -6
- package/dist/proxy/server.js.map +1 -1
- package/dist/session/manager.d.ts +2 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +106 -88
- package/dist/session/manager.js.map +1 -1
- package/dist/session/signing.d.ts +88 -0
- package/dist/session/signing.d.ts.map +1 -0
- package/dist/session/signing.js +166 -0
- package/dist/session/signing.js.map +1 -0
- package/dist/session/types.d.ts +2 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/utils/security-logger.d.ts +146 -0
- package/dist/utils/security-logger.d.ts.map +1 -0
- package/dist/utils/security-logger.js +222 -0
- package/dist/utils/security-logger.js.map +1 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +7 -1
- package/dist/wizard.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rule Suggester for Shell Guardian Learning System
|
|
3
|
+
*
|
|
4
|
+
* Analyzes approval history and learned patterns to suggest
|
|
5
|
+
* policy rules that would automate common decisions.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { DEFAULT_LEARNING_CONFIG } from './types.js';
|
|
9
|
+
import { groupByPattern, buildLearnedPatterns } from './pattern-extractor.js';
|
|
10
|
+
/**
|
|
11
|
+
* Analyze approval history and suggest rules.
|
|
12
|
+
*
|
|
13
|
+
* @param records - Approval history records
|
|
14
|
+
* @param existingConfig - Current guard config (to avoid duplicate rules)
|
|
15
|
+
* @param config - Learning configuration
|
|
16
|
+
* @returns Analysis result with suggestions
|
|
17
|
+
*/
|
|
18
|
+
export function analyzeAndSuggest(records, existingConfig, config = DEFAULT_LEARNING_CONFIG) {
|
|
19
|
+
// Filter out old records
|
|
20
|
+
const cutoff = new Date();
|
|
21
|
+
cutoff.setDate(cutoff.getDate() - config.maxRecordAgeDays);
|
|
22
|
+
const recentRecords = records.filter(r => new Date(r.timestamp) >= cutoff);
|
|
23
|
+
// Group by pattern and build learned patterns
|
|
24
|
+
const groups = groupByPattern(recentRecords);
|
|
25
|
+
const learnedPatterns = buildLearnedPatterns(groups);
|
|
26
|
+
const suggestions = [];
|
|
27
|
+
const insufficientData = [];
|
|
28
|
+
const inconsistent = [];
|
|
29
|
+
// Get existing rule patterns to avoid duplicates
|
|
30
|
+
const existingPatterns = new Set();
|
|
31
|
+
if (existingConfig?.rules) {
|
|
32
|
+
for (const rule of existingConfig.rules) {
|
|
33
|
+
existingPatterns.add(rule.pattern);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
for (const pattern of learnedPatterns) {
|
|
37
|
+
// Skip if already has a rule
|
|
38
|
+
if (existingPatterns.has(pattern.pattern)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Check if enough data
|
|
42
|
+
if (pattern.frequency < config.minOccurrences) {
|
|
43
|
+
insufficientData.push({
|
|
44
|
+
pattern: pattern.pattern,
|
|
45
|
+
occurrences: pattern.frequency,
|
|
46
|
+
needed: config.minOccurrences,
|
|
47
|
+
});
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Check for consistent approval (suggest allow rule)
|
|
51
|
+
if (pattern.approvalRate >= config.minApprovalRateForAllow) {
|
|
52
|
+
const suggestion = createAllowSuggestion(pattern, config);
|
|
53
|
+
if (suggestion && suggestion.confidence >= config.minConfidence) {
|
|
54
|
+
suggestions.push(suggestion);
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
// Check for consistent denial (suggest deny rule)
|
|
59
|
+
if (pattern.approvalRate <= config.maxApprovalRateForDeny) {
|
|
60
|
+
const suggestion = createDenySuggestion(pattern, config);
|
|
61
|
+
if (suggestion && suggestion.confidence >= config.minConfidence) {
|
|
62
|
+
suggestions.push(suggestion);
|
|
63
|
+
}
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Pattern is inconsistent - record for analysis
|
|
67
|
+
inconsistent.push({
|
|
68
|
+
pattern: pattern.pattern,
|
|
69
|
+
approvalRate: pattern.approvalRate,
|
|
70
|
+
denialRate: pattern.denialRate,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Sort suggestions by confidence
|
|
74
|
+
suggestions.sort((a, b) => b.confidence - a.confidence);
|
|
75
|
+
return {
|
|
76
|
+
suggestions,
|
|
77
|
+
insufficientData,
|
|
78
|
+
inconsistent,
|
|
79
|
+
stats: {
|
|
80
|
+
patternsAnalyzed: learnedPatterns.length,
|
|
81
|
+
suggestionsGenerated: suggestions.length,
|
|
82
|
+
highConfidenceSuggestions: suggestions.filter(s => s.confidence >= 0.9).length,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create an allow suggestion from a pattern.
|
|
88
|
+
*/
|
|
89
|
+
function createAllowSuggestion(pattern, config) {
|
|
90
|
+
// Calculate confidence based on multiple factors
|
|
91
|
+
let confidence = 0;
|
|
92
|
+
// Base confidence from approval rate
|
|
93
|
+
confidence += pattern.approvalRate * 0.4;
|
|
94
|
+
// Confidence boost from sample size
|
|
95
|
+
const sampleBoost = Math.min(pattern.frequency / 20, 0.3);
|
|
96
|
+
confidence += sampleBoost;
|
|
97
|
+
// Confidence boost from consistency (low timeout rate)
|
|
98
|
+
if (pattern.timeoutRate < 0.1) {
|
|
99
|
+
confidence += 0.1;
|
|
100
|
+
}
|
|
101
|
+
// Confidence boost if decisions were quick (users were confident)
|
|
102
|
+
if (pattern.avgDecisionTimeMs && pattern.avgDecisionTimeMs < 5000) {
|
|
103
|
+
confidence += 0.1;
|
|
104
|
+
}
|
|
105
|
+
// Reduce confidence if alternatives were often chosen
|
|
106
|
+
if (pattern.contextSummary.alternativeChoiceRate > 0.3) {
|
|
107
|
+
confidence -= 0.2;
|
|
108
|
+
}
|
|
109
|
+
confidence = Math.min(1, Math.max(0, confidence));
|
|
110
|
+
if (confidence < config.minConfidence) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const rule = {
|
|
114
|
+
pattern: pattern.pattern,
|
|
115
|
+
action: 'allow',
|
|
116
|
+
reason: `Automatically approved ${Math.round(pattern.approvalRate * 100)}% of the time`,
|
|
117
|
+
};
|
|
118
|
+
// Add conditions if pattern is context-specific
|
|
119
|
+
const dominantProjectType = getDominantContextValue(pattern.contextSummary.projectTypes);
|
|
120
|
+
if (dominantProjectType && dominantProjectType.percentage > 0.8) {
|
|
121
|
+
rule.conditions = {
|
|
122
|
+
...rule.conditions,
|
|
123
|
+
projectTypes: [dominantProjectType.value],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
id: randomUUID(),
|
|
128
|
+
rule,
|
|
129
|
+
reason: buildSuggestionReason(pattern, 'allow'),
|
|
130
|
+
basedOn: pattern,
|
|
131
|
+
confidence,
|
|
132
|
+
generatedAt: new Date(),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a deny suggestion from a pattern.
|
|
137
|
+
*/
|
|
138
|
+
function createDenySuggestion(pattern, config) {
|
|
139
|
+
// Calculate confidence
|
|
140
|
+
let confidence = 0;
|
|
141
|
+
// Base confidence from denial rate
|
|
142
|
+
confidence += pattern.denialRate * 0.4;
|
|
143
|
+
// Confidence boost from sample size
|
|
144
|
+
const sampleBoost = Math.min(pattern.frequency / 20, 0.3);
|
|
145
|
+
confidence += sampleBoost;
|
|
146
|
+
// Confidence boost from consistency
|
|
147
|
+
if (pattern.timeoutRate < 0.1) {
|
|
148
|
+
confidence += 0.1;
|
|
149
|
+
}
|
|
150
|
+
confidence = Math.min(1, Math.max(0, confidence));
|
|
151
|
+
if (confidence < config.minConfidence) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const rule = {
|
|
155
|
+
pattern: pattern.pattern,
|
|
156
|
+
action: 'deny',
|
|
157
|
+
reason: `Consistently denied (${Math.round(pattern.denialRate * 100)}% denial rate)`,
|
|
158
|
+
};
|
|
159
|
+
return {
|
|
160
|
+
id: randomUUID(),
|
|
161
|
+
rule,
|
|
162
|
+
reason: buildSuggestionReason(pattern, 'deny'),
|
|
163
|
+
basedOn: pattern,
|
|
164
|
+
confidence,
|
|
165
|
+
generatedAt: new Date(),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get the dominant value from a frequency map.
|
|
170
|
+
*/
|
|
171
|
+
function getDominantContextValue(map) {
|
|
172
|
+
const entries = Object.entries(map);
|
|
173
|
+
if (entries.length === 0)
|
|
174
|
+
return null;
|
|
175
|
+
const total = entries.reduce((sum, [, count]) => sum + count, 0);
|
|
176
|
+
const sorted = entries.sort((a, b) => b[1] - a[1]);
|
|
177
|
+
const [topValue, topCount] = sorted[0];
|
|
178
|
+
return {
|
|
179
|
+
value: topValue,
|
|
180
|
+
percentage: topCount / total,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Build a human-readable reason for a suggestion.
|
|
185
|
+
*/
|
|
186
|
+
function buildSuggestionReason(pattern, action) {
|
|
187
|
+
const parts = [];
|
|
188
|
+
if (action === 'allow') {
|
|
189
|
+
parts.push(`This command pattern was approved ${Math.round(pattern.approvalRate * 100)}% ` +
|
|
190
|
+
`of the time across ${pattern.frequency} occurrences.`);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
parts.push(`This command pattern was denied ${Math.round(pattern.denialRate * 100)}% ` +
|
|
194
|
+
`of the time across ${pattern.frequency} occurrences.`);
|
|
195
|
+
}
|
|
196
|
+
// Add context details
|
|
197
|
+
const dominantProject = getDominantContextValue(pattern.contextSummary.projectTypes);
|
|
198
|
+
if (dominantProject && dominantProject.value !== 'unknown') {
|
|
199
|
+
parts.push(`Primarily used in ${dominantProject.value} projects.`);
|
|
200
|
+
}
|
|
201
|
+
// Add timing info
|
|
202
|
+
if (pattern.avgDecisionTimeMs) {
|
|
203
|
+
if (pattern.avgDecisionTimeMs < 3000) {
|
|
204
|
+
parts.push('Users decided quickly, suggesting high confidence.');
|
|
205
|
+
}
|
|
206
|
+
else if (pattern.avgDecisionTimeMs > 10000) {
|
|
207
|
+
parts.push('Users took time to decide, suggesting careful consideration needed.');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Add alternative info
|
|
211
|
+
if (pattern.contextSummary.alternativeChoiceRate > 0.2) {
|
|
212
|
+
parts.push(`Note: Users chose alternatives ${Math.round(pattern.contextSummary.alternativeChoiceRate * 100)}% of the time.`);
|
|
213
|
+
}
|
|
214
|
+
return parts.join(' ');
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Convert a rule suggestion to a guard rule.
|
|
218
|
+
*/
|
|
219
|
+
export function suggestionToRule(suggestion) {
|
|
220
|
+
// Build reason string that includes condition info
|
|
221
|
+
let reason = suggestion.rule.reason || suggestion.reason;
|
|
222
|
+
if (suggestion.rule.conditions) {
|
|
223
|
+
const conditions = [];
|
|
224
|
+
if (suggestion.rule.conditions.projectTypes) {
|
|
225
|
+
conditions.push(`projects: ${suggestion.rule.conditions.projectTypes.join(', ')}`);
|
|
226
|
+
}
|
|
227
|
+
if (suggestion.rule.conditions.riskLevels) {
|
|
228
|
+
conditions.push(`risks: ${suggestion.rule.conditions.riskLevels.join(', ')}`);
|
|
229
|
+
}
|
|
230
|
+
if (suggestion.rule.conditions.directoryPatterns) {
|
|
231
|
+
conditions.push(`dirs: ${suggestion.rule.conditions.directoryPatterns.join(', ')}`);
|
|
232
|
+
}
|
|
233
|
+
if (conditions.length > 0) {
|
|
234
|
+
reason = `${reason} (${conditions.join('; ')})`;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
pattern: suggestion.rule.pattern,
|
|
239
|
+
action: suggestion.rule.action,
|
|
240
|
+
reason,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Format suggestions for display.
|
|
245
|
+
*/
|
|
246
|
+
export function formatSuggestions(suggestions) {
|
|
247
|
+
if (suggestions.length === 0) {
|
|
248
|
+
return 'No rule suggestions available. Keep using Shell Guardian to build up approval history.';
|
|
249
|
+
}
|
|
250
|
+
const lines = [
|
|
251
|
+
`Found ${suggestions.length} rule suggestion${suggestions.length > 1 ? 's' : ''}:`,
|
|
252
|
+
'',
|
|
253
|
+
];
|
|
254
|
+
for (let i = 0; i < suggestions.length; i++) {
|
|
255
|
+
const s = suggestions[i];
|
|
256
|
+
const conf = Math.round(s.confidence * 100);
|
|
257
|
+
const action = s.rule.action.toUpperCase();
|
|
258
|
+
lines.push(`${i + 1}. [${action}] ${s.rule.pattern}`);
|
|
259
|
+
lines.push(` Confidence: ${conf}% | Based on ${s.basedOn.frequency} occurrences`);
|
|
260
|
+
lines.push(` ${s.reason}`);
|
|
261
|
+
lines.push('');
|
|
262
|
+
}
|
|
263
|
+
return lines.join('\n');
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Export suggestions as YAML rules.
|
|
267
|
+
*/
|
|
268
|
+
export function exportSuggestionsAsYaml(suggestions) {
|
|
269
|
+
const lines = [
|
|
270
|
+
'# Auto-generated rules from Shell Guardian learning',
|
|
271
|
+
`# Generated: ${new Date().toISOString()}`,
|
|
272
|
+
'',
|
|
273
|
+
'rules:',
|
|
274
|
+
];
|
|
275
|
+
for (const suggestion of suggestions) {
|
|
276
|
+
const rule = suggestionToRule(suggestion);
|
|
277
|
+
lines.push(` - pattern: "${rule.pattern}"`);
|
|
278
|
+
lines.push(` action: ${rule.action}`);
|
|
279
|
+
lines.push(` reason: "${rule.reason}"`);
|
|
280
|
+
lines.push(` # Confidence: ${Math.round(suggestion.confidence * 100)}%`);
|
|
281
|
+
lines.push(` # Based on ${suggestion.basedOn.frequency} occurrences`);
|
|
282
|
+
// Add conditions as comments for reference
|
|
283
|
+
if (suggestion.rule.conditions) {
|
|
284
|
+
if (suggestion.rule.conditions.projectTypes) {
|
|
285
|
+
lines.push(` # Project types: ${suggestion.rule.conditions.projectTypes.join(', ')}`);
|
|
286
|
+
}
|
|
287
|
+
if (suggestion.rule.conditions.riskLevels) {
|
|
288
|
+
lines.push(` # Risk levels: ${suggestion.rule.conditions.riskLevels.join(', ')}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
lines.push('');
|
|
292
|
+
}
|
|
293
|
+
return lines.join('\n');
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Merge suggestions with existing config.
|
|
297
|
+
*/
|
|
298
|
+
export function mergeSuggestionsWithConfig(suggestions, config) {
|
|
299
|
+
const newRules = suggestions.map(suggestionToRule);
|
|
300
|
+
return {
|
|
301
|
+
...config,
|
|
302
|
+
rules: [
|
|
303
|
+
...(config.rules || []),
|
|
304
|
+
...newRules,
|
|
305
|
+
],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Find patterns that might benefit from more specific rules.
|
|
310
|
+
*/
|
|
311
|
+
export function findRefinementOpportunities(patterns) {
|
|
312
|
+
const opportunities = [];
|
|
313
|
+
for (const pattern of patterns) {
|
|
314
|
+
// Check for patterns with high alternative choice rate
|
|
315
|
+
if (pattern.contextSummary.alternativeChoiceRate > 0.5) {
|
|
316
|
+
opportunities.push({
|
|
317
|
+
pattern: pattern.pattern,
|
|
318
|
+
reason: `Users chose alternatives ${Math.round(pattern.contextSummary.alternativeChoiceRate * 100)}% of the time`,
|
|
319
|
+
suggestion: 'Consider using the safer alternative as the default',
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
// Check for patterns with long decision times
|
|
323
|
+
if (pattern.avgDecisionTimeMs && pattern.avgDecisionTimeMs > 15000) {
|
|
324
|
+
opportunities.push({
|
|
325
|
+
pattern: pattern.pattern,
|
|
326
|
+
reason: `Average decision time is ${Math.round(pattern.avgDecisionTimeMs / 1000)}s`,
|
|
327
|
+
suggestion: 'Consider adding more context or explanation for this command',
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
// Check for patterns that vary by project type
|
|
331
|
+
const projectTypes = Object.keys(pattern.contextSummary.projectTypes);
|
|
332
|
+
if (projectTypes.length > 1) {
|
|
333
|
+
const dominant = getDominantContextValue(pattern.contextSummary.projectTypes);
|
|
334
|
+
if (dominant && dominant.percentage < 0.6) {
|
|
335
|
+
opportunities.push({
|
|
336
|
+
pattern: pattern.pattern,
|
|
337
|
+
reason: 'Behavior varies significantly by project type',
|
|
338
|
+
suggestion: 'Consider creating project-specific rules',
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return opportunities;
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=rule-suggester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-suggester.js","sourceRoot":"","sources":["../../../src/guard/learning/rule-suggester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Shell Guardian Pattern Learning System
|
|
3
|
+
*
|
|
4
|
+
* Records user approval decisions and extracts patterns
|
|
5
|
+
* to suggest policy improvements over time.
|
|
6
|
+
*/
|
|
7
|
+
import type { RiskLevel } from '../../analyzers/types.js';
|
|
8
|
+
import type { GuardAction } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Record of a single approval decision.
|
|
11
|
+
*/
|
|
12
|
+
export interface ApprovalRecord {
|
|
13
|
+
/** Unique ID for this record */
|
|
14
|
+
id: string;
|
|
15
|
+
/** The original command */
|
|
16
|
+
command: string;
|
|
17
|
+
/** Normalized pattern extracted from command */
|
|
18
|
+
normalizedPattern: string;
|
|
19
|
+
/** The user's decision */
|
|
20
|
+
decision: 'approved' | 'denied' | 'timeout';
|
|
21
|
+
/** Timestamp of the decision */
|
|
22
|
+
timestamp: Date;
|
|
23
|
+
/** Duration user took to decide (ms) */
|
|
24
|
+
decisionTimeMs?: number;
|
|
25
|
+
/** Context at time of decision */
|
|
26
|
+
context: ApprovalContext;
|
|
27
|
+
/** If user chose an alternative */
|
|
28
|
+
chosenAlternative?: string;
|
|
29
|
+
/** Session grant if approved with remember */
|
|
30
|
+
sessionGrant?: {
|
|
31
|
+
scope: string;
|
|
32
|
+
duration: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Context captured with an approval record.
|
|
37
|
+
*/
|
|
38
|
+
export interface ApprovalContext {
|
|
39
|
+
/** Project type if detected */
|
|
40
|
+
projectType?: string;
|
|
41
|
+
/** Working directory */
|
|
42
|
+
cwd: string;
|
|
43
|
+
/** Risk level assigned */
|
|
44
|
+
riskLevel: RiskLevel;
|
|
45
|
+
/** Whether in git repo */
|
|
46
|
+
isGitRepo?: boolean;
|
|
47
|
+
/** Whether had uncommitted changes */
|
|
48
|
+
hadUncommittedChanges?: boolean;
|
|
49
|
+
/** Directory sensitivity score */
|
|
50
|
+
directorySensitivity?: number;
|
|
51
|
+
/** Environment type */
|
|
52
|
+
environment?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A pattern learned from approval history.
|
|
56
|
+
*/
|
|
57
|
+
export interface LearnedPattern {
|
|
58
|
+
/** The normalized pattern */
|
|
59
|
+
pattern: string;
|
|
60
|
+
/** Number of times this pattern occurred */
|
|
61
|
+
frequency: number;
|
|
62
|
+
/** Approval rate (0-1) */
|
|
63
|
+
approvalRate: number;
|
|
64
|
+
/** Denial rate (0-1) */
|
|
65
|
+
denialRate: number;
|
|
66
|
+
/** Timeout rate (0-1) */
|
|
67
|
+
timeoutRate: number;
|
|
68
|
+
/** Suggested action based on history */
|
|
69
|
+
suggestedAction: GuardAction;
|
|
70
|
+
/** Confidence in suggestion (0-1) */
|
|
71
|
+
confidence: number;
|
|
72
|
+
/** Example commands that matched this pattern */
|
|
73
|
+
examples: string[];
|
|
74
|
+
/** Average decision time for this pattern */
|
|
75
|
+
avgDecisionTimeMs?: number;
|
|
76
|
+
/** Last occurrence */
|
|
77
|
+
lastSeen: Date;
|
|
78
|
+
/** First occurrence */
|
|
79
|
+
firstSeen: Date;
|
|
80
|
+
/** Contexts where this pattern appeared */
|
|
81
|
+
contextSummary: PatternContextSummary;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Summary of contexts where a pattern appeared.
|
|
85
|
+
*/
|
|
86
|
+
export interface PatternContextSummary {
|
|
87
|
+
/** Project types where this pattern was used */
|
|
88
|
+
projectTypes: Record<string, number>;
|
|
89
|
+
/** Risk levels assigned to this pattern */
|
|
90
|
+
riskLevels: Record<RiskLevel, number>;
|
|
91
|
+
/** How often alternatives were chosen */
|
|
92
|
+
alternativeChoiceRate: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* A suggested rule based on learned patterns.
|
|
96
|
+
*/
|
|
97
|
+
export interface RuleSuggestion {
|
|
98
|
+
/** Unique ID for this suggestion */
|
|
99
|
+
id: string;
|
|
100
|
+
/** The suggested rule */
|
|
101
|
+
rule: SuggestedRule;
|
|
102
|
+
/** Why this rule is being suggested */
|
|
103
|
+
reason: string;
|
|
104
|
+
/** The learned pattern this is based on */
|
|
105
|
+
basedOn: LearnedPattern;
|
|
106
|
+
/** Confidence in this suggestion (0-1) */
|
|
107
|
+
confidence: number;
|
|
108
|
+
/** When this suggestion was generated */
|
|
109
|
+
generatedAt: Date;
|
|
110
|
+
/** Whether user has dismissed this suggestion */
|
|
111
|
+
dismissed?: boolean;
|
|
112
|
+
/** Whether user has accepted this suggestion */
|
|
113
|
+
accepted?: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A rule suggested by the learning system.
|
|
117
|
+
*/
|
|
118
|
+
export interface SuggestedRule {
|
|
119
|
+
/** Pattern to match */
|
|
120
|
+
pattern: string;
|
|
121
|
+
/** Suggested action */
|
|
122
|
+
action: GuardAction;
|
|
123
|
+
/** Optional reason to show user */
|
|
124
|
+
reason?: string;
|
|
125
|
+
/** Conditions for the rule */
|
|
126
|
+
conditions?: SuggestedRuleConditions;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Conditions for a suggested rule.
|
|
130
|
+
*/
|
|
131
|
+
export interface SuggestedRuleConditions {
|
|
132
|
+
/** Only apply in these project types */
|
|
133
|
+
projectTypes?: string[];
|
|
134
|
+
/** Only apply at these risk levels */
|
|
135
|
+
riskLevels?: RiskLevel[];
|
|
136
|
+
/** Only apply in certain directories */
|
|
137
|
+
directoryPatterns?: string[];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Storage interface for learning data.
|
|
141
|
+
*/
|
|
142
|
+
export interface LearningStorage {
|
|
143
|
+
/** Save an approval record */
|
|
144
|
+
saveRecord(record: ApprovalRecord): Promise<void>;
|
|
145
|
+
/** Get all records */
|
|
146
|
+
getRecords(options?: GetRecordsOptions): Promise<ApprovalRecord[]>;
|
|
147
|
+
/** Get records matching a pattern */
|
|
148
|
+
getRecordsByPattern(pattern: string): Promise<ApprovalRecord[]>;
|
|
149
|
+
/** Save a rule suggestion */
|
|
150
|
+
saveSuggestion(suggestion: RuleSuggestion): Promise<void>;
|
|
151
|
+
/** Get all suggestions */
|
|
152
|
+
getSuggestions(): Promise<RuleSuggestion[]>;
|
|
153
|
+
/** Update suggestion status */
|
|
154
|
+
updateSuggestion(id: string, update: Partial<RuleSuggestion>): Promise<void>;
|
|
155
|
+
/** Clear all learning data */
|
|
156
|
+
clear(): Promise<void>;
|
|
157
|
+
/** Get statistics */
|
|
158
|
+
getStats(): Promise<LearningStats>;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Options for getting records.
|
|
162
|
+
*/
|
|
163
|
+
export interface GetRecordsOptions {
|
|
164
|
+
/** Only get records after this date */
|
|
165
|
+
since?: Date;
|
|
166
|
+
/** Only get records before this date */
|
|
167
|
+
until?: Date;
|
|
168
|
+
/** Maximum number of records */
|
|
169
|
+
limit?: number;
|
|
170
|
+
/** Only get records with this decision */
|
|
171
|
+
decision?: 'approved' | 'denied' | 'timeout';
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Statistics about learning data.
|
|
175
|
+
*/
|
|
176
|
+
export interface LearningStats {
|
|
177
|
+
/** Total records */
|
|
178
|
+
totalRecords: number;
|
|
179
|
+
/** Records by decision */
|
|
180
|
+
byDecision: Record<string, number>;
|
|
181
|
+
/** Unique patterns */
|
|
182
|
+
uniquePatterns: number;
|
|
183
|
+
/** Active suggestions */
|
|
184
|
+
activeSuggestions: number;
|
|
185
|
+
/** Date of oldest record */
|
|
186
|
+
oldestRecord?: Date;
|
|
187
|
+
/** Date of newest record */
|
|
188
|
+
newestRecord?: Date;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Configuration for the learning engine.
|
|
192
|
+
*/
|
|
193
|
+
export interface LearningConfig {
|
|
194
|
+
/** Minimum occurrences before suggesting a rule */
|
|
195
|
+
minOccurrences: number;
|
|
196
|
+
/** Minimum approval rate to suggest allow */
|
|
197
|
+
minApprovalRateForAllow: number;
|
|
198
|
+
/** Maximum approval rate to suggest deny */
|
|
199
|
+
maxApprovalRateForDeny: number;
|
|
200
|
+
/** Minimum confidence to suggest a rule */
|
|
201
|
+
minConfidence: number;
|
|
202
|
+
/** Maximum age of records to consider (days) */
|
|
203
|
+
maxRecordAgeDays: number;
|
|
204
|
+
/** Whether to track decision times */
|
|
205
|
+
trackDecisionTime: boolean;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Default learning configuration.
|
|
209
|
+
*/
|
|
210
|
+
export declare const DEFAULT_LEARNING_CONFIG: LearningConfig;
|
|
211
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/guard/learning/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Types for Shell Guardian Pattern Learning System
|
|
3
|
+
*
|
|
4
|
+
* Records user approval decisions and extracts patterns
|
|
5
|
+
* to suggest policy improvements over time.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Default learning configuration.
|
|
9
|
+
*/
|
|
10
|
+
export const DEFAULT_LEARNING_CONFIG = {
|
|
11
|
+
minOccurrences: 3,
|
|
12
|
+
minApprovalRateForAllow: 0.9,
|
|
13
|
+
maxApprovalRateForDeny: 0.1,
|
|
14
|
+
minConfidence: 0.7,
|
|
15
|
+
maxRecordAgeDays: 90,
|
|
16
|
+
trackDecisionTime: true,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/guard/learning/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsNH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,cAAc,EAAE,CAAC;IACjB,uBAAuB,EAAE,GAAG;IAC5B,sBAAsB,EAAE,GAAG;IAC3B,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,EAAE;IACpB,iBAAiB,EAAE,IAAI;CACxB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect Analyzer for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Analyzes what effects a command will have.
|
|
5
|
+
*/
|
|
6
|
+
import type { CommandEffect, ParsedCommand, ImpactAssessment, PreviewOptions } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Analyze effects of a parsed command.
|
|
9
|
+
*/
|
|
10
|
+
export declare function analyzeEffects(parsed: ParsedCommand, options?: Partial<PreviewOptions>): Promise<CommandEffect[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Calculate impact assessment from effects.
|
|
13
|
+
*/
|
|
14
|
+
export declare function calculateImpact(effects: CommandEffect[], options?: Partial<PreviewOptions>): ImpactAssessment;
|
|
15
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../../src/guard/preview/effects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EACV,aAAa,EAGb,aAAa,EACb,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AAoKpB;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC,CA6F1B;AA4ED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EAAE,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAChC,gBAAgB,CA4ElB"}
|