@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,314 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Learning System for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Records approval decisions and learns patterns to suggest
|
|
5
|
+
* policy improvements over time.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
8
|
+
import { join, dirname } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { DEFAULT_LEARNING_CONFIG } from './types.js';
|
|
12
|
+
import { extractPattern, groupByPattern, buildLearnedPatterns } from './pattern-extractor.js';
|
|
13
|
+
import { analyzeAndSuggest, formatSuggestions, exportSuggestionsAsYaml, findRefinementOpportunities, } from './rule-suggester.js';
|
|
14
|
+
export { DEFAULT_LEARNING_CONFIG } from './types.js';
|
|
15
|
+
// Re-export functions
|
|
16
|
+
export { extractPattern, groupByPattern, buildLearnedPatterns, patternSimilarity, findSimilarPatterns, } from './pattern-extractor.js';
|
|
17
|
+
export { analyzeAndSuggest, formatSuggestions, exportSuggestionsAsYaml, suggestionToRule, findRefinementOpportunities, } from './rule-suggester.js';
|
|
18
|
+
/**
|
|
19
|
+
* Default storage path for learning data.
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_STORAGE_PATH = join(homedir(), '.config', 'tollgate', 'learning.json');
|
|
22
|
+
/**
|
|
23
|
+
* JSON file-based learning storage.
|
|
24
|
+
*/
|
|
25
|
+
export class JsonLearningStorage {
|
|
26
|
+
path;
|
|
27
|
+
data;
|
|
28
|
+
constructor(path = DEFAULT_STORAGE_PATH) {
|
|
29
|
+
this.path = path;
|
|
30
|
+
this.data = this.load();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Load data from file.
|
|
34
|
+
*/
|
|
35
|
+
load() {
|
|
36
|
+
try {
|
|
37
|
+
if (existsSync(this.path)) {
|
|
38
|
+
const content = readFileSync(this.path, 'utf-8');
|
|
39
|
+
return JSON.parse(content);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// File doesn't exist or is invalid, start fresh
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
version: 1,
|
|
47
|
+
records: [],
|
|
48
|
+
suggestions: [],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Save data to file.
|
|
53
|
+
*/
|
|
54
|
+
save() {
|
|
55
|
+
const dir = dirname(this.path);
|
|
56
|
+
if (!existsSync(dir)) {
|
|
57
|
+
mkdirSync(dir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
writeFileSync(this.path, JSON.stringify(this.data, null, 2));
|
|
60
|
+
}
|
|
61
|
+
async saveRecord(record) {
|
|
62
|
+
this.data.records.push(record);
|
|
63
|
+
this.save();
|
|
64
|
+
}
|
|
65
|
+
async getRecords(options) {
|
|
66
|
+
let records = [...this.data.records];
|
|
67
|
+
if (options?.since) {
|
|
68
|
+
const since = options.since.getTime();
|
|
69
|
+
records = records.filter(r => new Date(r.timestamp).getTime() >= since);
|
|
70
|
+
}
|
|
71
|
+
if (options?.until) {
|
|
72
|
+
const until = options.until.getTime();
|
|
73
|
+
records = records.filter(r => new Date(r.timestamp).getTime() <= until);
|
|
74
|
+
}
|
|
75
|
+
if (options?.decision) {
|
|
76
|
+
records = records.filter(r => r.decision === options.decision);
|
|
77
|
+
}
|
|
78
|
+
if (options?.limit) {
|
|
79
|
+
records = records.slice(0, options.limit);
|
|
80
|
+
}
|
|
81
|
+
return records;
|
|
82
|
+
}
|
|
83
|
+
async getRecordsByPattern(pattern) {
|
|
84
|
+
return this.data.records.filter(r => r.normalizedPattern === pattern);
|
|
85
|
+
}
|
|
86
|
+
async saveSuggestion(suggestion) {
|
|
87
|
+
// Remove existing suggestion for same pattern
|
|
88
|
+
this.data.suggestions = this.data.suggestions.filter(s => s.rule.pattern !== suggestion.rule.pattern);
|
|
89
|
+
this.data.suggestions.push(suggestion);
|
|
90
|
+
this.save();
|
|
91
|
+
}
|
|
92
|
+
async getSuggestions() {
|
|
93
|
+
return [...this.data.suggestions];
|
|
94
|
+
}
|
|
95
|
+
async updateSuggestion(id, update) {
|
|
96
|
+
const index = this.data.suggestions.findIndex(s => s.id === id);
|
|
97
|
+
if (index !== -1) {
|
|
98
|
+
this.data.suggestions[index] = { ...this.data.suggestions[index], ...update };
|
|
99
|
+
this.save();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
async clear() {
|
|
103
|
+
this.data = {
|
|
104
|
+
version: 1,
|
|
105
|
+
records: [],
|
|
106
|
+
suggestions: [],
|
|
107
|
+
};
|
|
108
|
+
this.save();
|
|
109
|
+
}
|
|
110
|
+
async getStats() {
|
|
111
|
+
const records = this.data.records;
|
|
112
|
+
const byDecision = {};
|
|
113
|
+
for (const r of records) {
|
|
114
|
+
byDecision[r.decision] = (byDecision[r.decision] || 0) + 1;
|
|
115
|
+
}
|
|
116
|
+
const uniquePatterns = new Set(records.map(r => r.normalizedPattern)).size;
|
|
117
|
+
const activeSuggestions = this.data.suggestions.filter(s => !s.dismissed && !s.accepted).length;
|
|
118
|
+
const sorted = [...records].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
119
|
+
return {
|
|
120
|
+
totalRecords: records.length,
|
|
121
|
+
byDecision,
|
|
122
|
+
uniquePatterns,
|
|
123
|
+
activeSuggestions,
|
|
124
|
+
oldestRecord: sorted[0] ? new Date(sorted[0].timestamp) : undefined,
|
|
125
|
+
newestRecord: sorted[sorted.length - 1]
|
|
126
|
+
? new Date(sorted[sorted.length - 1].timestamp)
|
|
127
|
+
: undefined,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Learning Engine for Shell Guardian.
|
|
133
|
+
*
|
|
134
|
+
* Manages recording of approval decisions and generation
|
|
135
|
+
* of rule suggestions based on learned patterns.
|
|
136
|
+
*/
|
|
137
|
+
export class LearningEngine {
|
|
138
|
+
storage;
|
|
139
|
+
config;
|
|
140
|
+
recordStartTime;
|
|
141
|
+
constructor(storage, config = {}) {
|
|
142
|
+
this.storage = storage || new JsonLearningStorage();
|
|
143
|
+
this.config = { ...DEFAULT_LEARNING_CONFIG, ...config };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Start timing a decision.
|
|
147
|
+
* Call this when showing the approval prompt.
|
|
148
|
+
*/
|
|
149
|
+
startDecisionTimer() {
|
|
150
|
+
if (this.config.trackDecisionTime) {
|
|
151
|
+
this.recordStartTime = Date.now();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Record an approval decision.
|
|
156
|
+
*
|
|
157
|
+
* @param command - The command that was evaluated
|
|
158
|
+
* @param decision - The user's decision
|
|
159
|
+
* @param context - Enhanced guard context
|
|
160
|
+
* @param options - Additional options
|
|
161
|
+
*/
|
|
162
|
+
async record(command, decision, context, options) {
|
|
163
|
+
const decisionTimeMs = this.recordStartTime
|
|
164
|
+
? Date.now() - this.recordStartTime
|
|
165
|
+
: undefined;
|
|
166
|
+
const record = {
|
|
167
|
+
id: randomUUID(),
|
|
168
|
+
command,
|
|
169
|
+
normalizedPattern: extractPattern(command),
|
|
170
|
+
decision,
|
|
171
|
+
timestamp: new Date(),
|
|
172
|
+
decisionTimeMs,
|
|
173
|
+
context: {
|
|
174
|
+
projectType: context.project?.type,
|
|
175
|
+
cwd: context.cwd || process.cwd(),
|
|
176
|
+
riskLevel: options.riskLevel,
|
|
177
|
+
isGitRepo: context.git?.isRepo,
|
|
178
|
+
hadUncommittedChanges: context.git?.hasUncommittedChanges,
|
|
179
|
+
directorySensitivity: context.directory?.sensitivity,
|
|
180
|
+
environment: context.environment?.type,
|
|
181
|
+
},
|
|
182
|
+
chosenAlternative: options.chosenAlternative,
|
|
183
|
+
sessionGrant: options.sessionGrant,
|
|
184
|
+
};
|
|
185
|
+
await this.storage.saveRecord(record);
|
|
186
|
+
this.recordStartTime = undefined;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Get all approval records.
|
|
190
|
+
*/
|
|
191
|
+
async getRecords(options) {
|
|
192
|
+
return this.storage.getRecords(options);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get learned patterns from history.
|
|
196
|
+
*/
|
|
197
|
+
async getLearnedPatterns() {
|
|
198
|
+
const records = await this.storage.getRecords();
|
|
199
|
+
const groups = groupByPattern(records);
|
|
200
|
+
return buildLearnedPatterns(groups);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Generate rule suggestions based on learned patterns.
|
|
204
|
+
*/
|
|
205
|
+
async generateSuggestions(existingConfig) {
|
|
206
|
+
const records = await this.storage.getRecords();
|
|
207
|
+
const analysis = analyzeAndSuggest(records, existingConfig, this.config);
|
|
208
|
+
// Save suggestions to storage
|
|
209
|
+
for (const suggestion of analysis.suggestions) {
|
|
210
|
+
await this.storage.saveSuggestion(suggestion);
|
|
211
|
+
}
|
|
212
|
+
return analysis.suggestions;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get existing suggestions.
|
|
216
|
+
*/
|
|
217
|
+
async getSuggestions() {
|
|
218
|
+
return this.storage.getSuggestions();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Accept a suggestion.
|
|
222
|
+
*/
|
|
223
|
+
async acceptSuggestion(id) {
|
|
224
|
+
await this.storage.updateSuggestion(id, { accepted: true });
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Dismiss a suggestion.
|
|
228
|
+
*/
|
|
229
|
+
async dismissSuggestion(id) {
|
|
230
|
+
await this.storage.updateSuggestion(id, { dismissed: true });
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get learning statistics.
|
|
234
|
+
*/
|
|
235
|
+
async getStats() {
|
|
236
|
+
return this.storage.getStats();
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Clear all learning data.
|
|
240
|
+
*/
|
|
241
|
+
async clear() {
|
|
242
|
+
await this.storage.clear();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Export suggestions as YAML for config.
|
|
246
|
+
*/
|
|
247
|
+
async exportSuggestionsYaml() {
|
|
248
|
+
const suggestions = await this.storage.getSuggestions();
|
|
249
|
+
const active = suggestions.filter(s => !s.dismissed && !s.accepted);
|
|
250
|
+
return exportSuggestionsAsYaml(active);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Format suggestions for display.
|
|
254
|
+
*/
|
|
255
|
+
async formatSuggestions() {
|
|
256
|
+
const suggestions = await this.storage.getSuggestions();
|
|
257
|
+
const active = suggestions.filter(s => !s.dismissed && !s.accepted);
|
|
258
|
+
return formatSuggestions(active);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Get refinement opportunities.
|
|
262
|
+
*/
|
|
263
|
+
async getRefinementOpportunities() {
|
|
264
|
+
const patterns = await this.getLearnedPatterns();
|
|
265
|
+
return findRefinementOpportunities(patterns);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Create a learning engine with default storage.
|
|
270
|
+
*/
|
|
271
|
+
export function createLearningEngine(config) {
|
|
272
|
+
return new LearningEngine(undefined, config);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Create a learning engine with custom storage path.
|
|
276
|
+
*/
|
|
277
|
+
export function createLearningEngineWithPath(storagePath, config) {
|
|
278
|
+
const storage = new JsonLearningStorage(storagePath);
|
|
279
|
+
return new LearningEngine(storage, config);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Format learning stats for display.
|
|
283
|
+
*/
|
|
284
|
+
export function formatLearningStats(stats) {
|
|
285
|
+
const lines = [
|
|
286
|
+
'Shell Guardian Learning Statistics',
|
|
287
|
+
'─'.repeat(40),
|
|
288
|
+
'',
|
|
289
|
+
`Total decisions recorded: ${stats.totalRecords}`,
|
|
290
|
+
`Unique command patterns: ${stats.uniquePatterns}`,
|
|
291
|
+
`Active suggestions: ${stats.activeSuggestions}`,
|
|
292
|
+
'',
|
|
293
|
+
'Decisions by type:',
|
|
294
|
+
];
|
|
295
|
+
for (const [decision, count] of Object.entries(stats.byDecision)) {
|
|
296
|
+
const pct = stats.totalRecords > 0
|
|
297
|
+
? Math.round((count / stats.totalRecords) * 100)
|
|
298
|
+
: 0;
|
|
299
|
+
lines.push(` ${decision}: ${count} (${pct}%)`);
|
|
300
|
+
}
|
|
301
|
+
if (stats.oldestRecord) {
|
|
302
|
+
lines.push('');
|
|
303
|
+
lines.push(`Recording since: ${stats.oldestRecord.toLocaleDateString()}`);
|
|
304
|
+
}
|
|
305
|
+
return lines.join('\n');
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Quick check if there's enough data for suggestions.
|
|
309
|
+
*/
|
|
310
|
+
export async function hasEnoughDataForSuggestions(engine, minRecords = 10) {
|
|
311
|
+
const stats = await engine.getStats();
|
|
312
|
+
return stats.totalRecords >= minRecords;
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/guard/learning/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Extractor for Shell Guardian Learning System
|
|
3
|
+
*
|
|
4
|
+
* Extracts normalizable patterns from commands to identify
|
|
5
|
+
* similar command structures across different arguments.
|
|
6
|
+
*/
|
|
7
|
+
import type { ApprovalRecord, LearnedPattern } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extract a normalized pattern from a command.
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* "rm -rf node_modules" → "rm -rf <directory>"
|
|
13
|
+
* "npm install lodash" → "npm install <package>"
|
|
14
|
+
* "git commit -m 'fix bug'" → "git commit -m <message>"
|
|
15
|
+
* "cat /etc/passwd" → "cat <path>"
|
|
16
|
+
*
|
|
17
|
+
* @param command - The command to extract pattern from
|
|
18
|
+
* @returns Normalized pattern string
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractPattern(command: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Group approval records by their extracted pattern.
|
|
23
|
+
*
|
|
24
|
+
* @param records - Approval records to group
|
|
25
|
+
* @returns Map of pattern to records
|
|
26
|
+
*/
|
|
27
|
+
export declare function groupByPattern(records: ApprovalRecord[]): Map<string, ApprovalRecord[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Build learned patterns from grouped records.
|
|
30
|
+
*
|
|
31
|
+
* @param groups - Grouped records by pattern
|
|
32
|
+
* @returns Array of learned patterns
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildLearnedPatterns(groups: Map<string, ApprovalRecord[]>): LearnedPattern[];
|
|
35
|
+
/**
|
|
36
|
+
* Calculate similarity between two patterns.
|
|
37
|
+
*
|
|
38
|
+
* @param pattern1 - First pattern
|
|
39
|
+
* @param pattern2 - Second pattern
|
|
40
|
+
* @returns Similarity score (0-1)
|
|
41
|
+
*/
|
|
42
|
+
export declare function patternSimilarity(pattern1: string, pattern2: string): number;
|
|
43
|
+
/**
|
|
44
|
+
* Find similar patterns in a list.
|
|
45
|
+
*/
|
|
46
|
+
export declare function findSimilarPatterns(target: string, patterns: string[], threshold?: number): Array<{
|
|
47
|
+
pattern: string;
|
|
48
|
+
similarity: number;
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=pattern-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-extractor.d.ts","sourceRoot":"","sources":["../../../src/guard/learning/pattern-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAyB,MAAM,YAAY,CAAC;AA8GxF;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA0EtD;AAkFD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAWvF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,GACpC,cAAc,EAAE,CAiElB;AAgCD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyB5E;AASD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,SAAM,GACd,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAYhD"}
|