@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,372 @@
|
|
|
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 { parseCommand } from '../preview/parser.js';
|
|
8
|
+
/**
|
|
9
|
+
* Known argument patterns for normalization.
|
|
10
|
+
*/
|
|
11
|
+
const ARGUMENT_PATTERNS = [
|
|
12
|
+
// URLs
|
|
13
|
+
{ pattern: /^https?:\/\/[^\s]+$/, type: 'url' },
|
|
14
|
+
// Git branches/refs
|
|
15
|
+
{ pattern: /^(origin|upstream)\/[\w-]+$/, type: 'branch', context: ['git'] },
|
|
16
|
+
{ pattern: /^(main|master|develop|HEAD|HEAD~\d+)$/, type: 'branch', context: ['git'] },
|
|
17
|
+
// Process IDs
|
|
18
|
+
{ pattern: /^\d{2,6}$/, type: 'pid', context: ['kill', 'pkill'] },
|
|
19
|
+
// Signals
|
|
20
|
+
{ pattern: /^-?(TERM|KILL|HUP|INT|QUIT|USR1|USR2|\d{1,2})$/, type: 'signal', context: ['kill'] },
|
|
21
|
+
// Permissions (octal)
|
|
22
|
+
{ pattern: /^[0-7]{3,4}$/, type: 'permission', context: ['chmod'] },
|
|
23
|
+
// Common node_modules pattern
|
|
24
|
+
{ pattern: /^node_modules\/?.*$/, type: 'directory' },
|
|
25
|
+
// Glob patterns
|
|
26
|
+
{ pattern: /\*|\?|\[.+\]/, type: 'glob' },
|
|
27
|
+
// Package names (npm style)
|
|
28
|
+
{ pattern: /^@?[\w-]+\/[\w-]+$/, type: 'package' },
|
|
29
|
+
{ pattern: /^[\w-]+@[\d.]+$/, type: 'package' },
|
|
30
|
+
// Paths with common patterns
|
|
31
|
+
{ pattern: /^[./~].*\/.*$/, type: 'path' },
|
|
32
|
+
{ pattern: /^\/.*$/, type: 'path' },
|
|
33
|
+
// Files with extensions
|
|
34
|
+
{ pattern: /^[\w.-]+\.\w+$/, type: 'file' },
|
|
35
|
+
// Directories (ending with /)
|
|
36
|
+
{ pattern: /^[\w.-]+\/$/, type: 'directory' },
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Commands where arguments are typically packages.
|
|
40
|
+
*/
|
|
41
|
+
const PACKAGE_COMMANDS = new Set([
|
|
42
|
+
'npm install', 'npm uninstall', 'npm update', 'npm remove',
|
|
43
|
+
'yarn add', 'yarn remove',
|
|
44
|
+
'pnpm add', 'pnpm remove',
|
|
45
|
+
'pip install', 'pip uninstall',
|
|
46
|
+
'cargo add', 'cargo remove',
|
|
47
|
+
'gem install', 'gem uninstall',
|
|
48
|
+
'go get',
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* Commands where arguments are typically files/paths.
|
|
52
|
+
*/
|
|
53
|
+
const FILE_COMMANDS = new Set([
|
|
54
|
+
'rm', 'mv', 'cp', 'cat', 'less', 'head', 'tail', 'touch',
|
|
55
|
+
'mkdir', 'rmdir', 'chmod', 'chown',
|
|
56
|
+
]);
|
|
57
|
+
/**
|
|
58
|
+
* Commands where arguments are typically branches.
|
|
59
|
+
*/
|
|
60
|
+
const BRANCH_COMMANDS = new Set([
|
|
61
|
+
'git checkout', 'git switch', 'git merge', 'git rebase',
|
|
62
|
+
'git branch', 'git push', 'git pull',
|
|
63
|
+
]);
|
|
64
|
+
/**
|
|
65
|
+
* Commands where arguments are typically messages.
|
|
66
|
+
*/
|
|
67
|
+
const MESSAGE_COMMANDS = new Set([
|
|
68
|
+
'git commit',
|
|
69
|
+
]);
|
|
70
|
+
/**
|
|
71
|
+
* Extract a normalized pattern from a command.
|
|
72
|
+
*
|
|
73
|
+
* Examples:
|
|
74
|
+
* "rm -rf node_modules" → "rm -rf <directory>"
|
|
75
|
+
* "npm install lodash" → "npm install <package>"
|
|
76
|
+
* "git commit -m 'fix bug'" → "git commit -m <message>"
|
|
77
|
+
* "cat /etc/passwd" → "cat <path>"
|
|
78
|
+
*
|
|
79
|
+
* @param command - The command to extract pattern from
|
|
80
|
+
* @returns Normalized pattern string
|
|
81
|
+
*/
|
|
82
|
+
export function extractPattern(command) {
|
|
83
|
+
try {
|
|
84
|
+
const parsed = parseCommand(command);
|
|
85
|
+
const parts = [];
|
|
86
|
+
// Add executable
|
|
87
|
+
parts.push(parsed.executable);
|
|
88
|
+
// Add subcommand if present
|
|
89
|
+
if (parsed.subcommand) {
|
|
90
|
+
parts.push(parsed.subcommand);
|
|
91
|
+
}
|
|
92
|
+
// Get full command for context
|
|
93
|
+
const fullCommand = parsed.subcommand
|
|
94
|
+
? `${parsed.executable} ${parsed.subcommand}`
|
|
95
|
+
: parsed.executable;
|
|
96
|
+
// Add flags (normalized - just the flag names, not values)
|
|
97
|
+
const sortedFlags = [...parsed.flags].sort((a, b) => a.name.localeCompare(b.name));
|
|
98
|
+
for (const flag of sortedFlags) {
|
|
99
|
+
if (flag.type === 'short') {
|
|
100
|
+
parts.push(`-${flag.name}`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// For long flags with values, keep the flag but normalize the value
|
|
104
|
+
if (flag.value) {
|
|
105
|
+
const normalizedValue = normalizeArgument(flag.value, fullCommand);
|
|
106
|
+
parts.push(`--${flag.name}=${normalizedValue}`);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
parts.push(`--${flag.name}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Normalize positional arguments
|
|
114
|
+
for (const arg of parsed.positionalArgs) {
|
|
115
|
+
const normalized = normalizeArgument(arg, fullCommand);
|
|
116
|
+
parts.push(normalized);
|
|
117
|
+
}
|
|
118
|
+
// Handle pipes recursively
|
|
119
|
+
if (parsed.pipes.length > 0) {
|
|
120
|
+
parts.push('|');
|
|
121
|
+
for (const piped of parsed.pipes) {
|
|
122
|
+
parts.push(extractPattern(piped.original));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Handle redirects
|
|
126
|
+
for (const redirect of parsed.redirects) {
|
|
127
|
+
const normalized = normalizeArgument(redirect.target, fullCommand);
|
|
128
|
+
switch (redirect.type) {
|
|
129
|
+
case 'stdout':
|
|
130
|
+
parts.push(`> ${normalized}`);
|
|
131
|
+
break;
|
|
132
|
+
case 'append':
|
|
133
|
+
parts.push(`>> ${normalized}`);
|
|
134
|
+
break;
|
|
135
|
+
case 'stderr':
|
|
136
|
+
parts.push(`2> ${normalized}`);
|
|
137
|
+
break;
|
|
138
|
+
case 'stdin':
|
|
139
|
+
parts.push(`< ${normalized}`);
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return parts.join(' ');
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// If parsing fails, do simple normalization
|
|
147
|
+
return simpleNormalize(command);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Normalize a single argument based on context.
|
|
152
|
+
*/
|
|
153
|
+
function normalizeArgument(arg, context) {
|
|
154
|
+
// Check for specific command contexts
|
|
155
|
+
if (PACKAGE_COMMANDS.has(context)) {
|
|
156
|
+
return '<package>';
|
|
157
|
+
}
|
|
158
|
+
if (MESSAGE_COMMANDS.has(context)) {
|
|
159
|
+
return '<message>';
|
|
160
|
+
}
|
|
161
|
+
if (BRANCH_COMMANDS.has(context)) {
|
|
162
|
+
// Keep common branch names, normalize others
|
|
163
|
+
if (['main', 'master', 'develop', 'HEAD'].includes(arg)) {
|
|
164
|
+
return arg;
|
|
165
|
+
}
|
|
166
|
+
return '<branch>';
|
|
167
|
+
}
|
|
168
|
+
// Check argument patterns
|
|
169
|
+
for (const pattern of ARGUMENT_PATTERNS) {
|
|
170
|
+
if (pattern.context && !pattern.context.some(c => context.includes(c))) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (pattern.pattern.test(arg)) {
|
|
174
|
+
return `<${pattern.type}>`;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// For file commands, normalize paths
|
|
178
|
+
if (FILE_COMMANDS.has(context.split(' ')[0])) {
|
|
179
|
+
// Keep known directory names
|
|
180
|
+
if (isKnownDirectory(arg)) {
|
|
181
|
+
return arg;
|
|
182
|
+
}
|
|
183
|
+
return '<path>';
|
|
184
|
+
}
|
|
185
|
+
// Keep short literal arguments (likely options or keywords)
|
|
186
|
+
if (arg.length <= 10 && /^[\w-]+$/.test(arg)) {
|
|
187
|
+
return arg;
|
|
188
|
+
}
|
|
189
|
+
// Default to generic arg placeholder
|
|
190
|
+
return '<arg>';
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Check if this is a known directory name worth preserving.
|
|
194
|
+
*/
|
|
195
|
+
function isKnownDirectory(arg) {
|
|
196
|
+
const knownDirs = [
|
|
197
|
+
'node_modules', 'vendor', '.git', '.svn',
|
|
198
|
+
'build', 'dist', 'out', 'target',
|
|
199
|
+
'src', 'lib', 'test', 'tests', 'spec',
|
|
200
|
+
'__pycache__', '.pytest_cache', '.venv', 'venv',
|
|
201
|
+
'.cache', '.npm', '.yarn',
|
|
202
|
+
];
|
|
203
|
+
const baseName = arg.replace(/\/$/, '').split('/').pop() || arg;
|
|
204
|
+
return knownDirs.includes(baseName);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Simple normalization when parsing fails.
|
|
208
|
+
*/
|
|
209
|
+
function simpleNormalize(command) {
|
|
210
|
+
// Replace quoted strings
|
|
211
|
+
let normalized = command.replace(/"[^"]*"/g, '<string>');
|
|
212
|
+
normalized = normalized.replace(/'[^']*'/g, '<string>');
|
|
213
|
+
// Replace paths
|
|
214
|
+
normalized = normalized.replace(/\/[\w./-]+/g, '<path>');
|
|
215
|
+
// Replace numbers
|
|
216
|
+
normalized = normalized.replace(/\b\d+\b/g, '<num>');
|
|
217
|
+
return normalized;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Group approval records by their extracted pattern.
|
|
221
|
+
*
|
|
222
|
+
* @param records - Approval records to group
|
|
223
|
+
* @returns Map of pattern to records
|
|
224
|
+
*/
|
|
225
|
+
export function groupByPattern(records) {
|
|
226
|
+
const groups = new Map();
|
|
227
|
+
for (const record of records) {
|
|
228
|
+
const pattern = record.normalizedPattern || extractPattern(record.command);
|
|
229
|
+
const existing = groups.get(pattern) || [];
|
|
230
|
+
existing.push(record);
|
|
231
|
+
groups.set(pattern, existing);
|
|
232
|
+
}
|
|
233
|
+
return groups;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Build learned patterns from grouped records.
|
|
237
|
+
*
|
|
238
|
+
* @param groups - Grouped records by pattern
|
|
239
|
+
* @returns Array of learned patterns
|
|
240
|
+
*/
|
|
241
|
+
export function buildLearnedPatterns(groups) {
|
|
242
|
+
const patterns = [];
|
|
243
|
+
for (const [pattern, records] of groups) {
|
|
244
|
+
if (records.length === 0)
|
|
245
|
+
continue;
|
|
246
|
+
const approved = records.filter(r => r.decision === 'approved').length;
|
|
247
|
+
const denied = records.filter(r => r.decision === 'denied').length;
|
|
248
|
+
const timeout = records.filter(r => r.decision === 'timeout').length;
|
|
249
|
+
const total = records.length;
|
|
250
|
+
const approvalRate = approved / total;
|
|
251
|
+
const denialRate = denied / total;
|
|
252
|
+
const timeoutRate = timeout / total;
|
|
253
|
+
// Calculate confidence based on sample size and consistency
|
|
254
|
+
const dominantRate = Math.max(approvalRate, denialRate, timeoutRate);
|
|
255
|
+
const sampleSizeConfidence = Math.min(1, total / 10);
|
|
256
|
+
const consistency = dominantRate;
|
|
257
|
+
const confidence = (sampleSizeConfidence + consistency) / 2;
|
|
258
|
+
// Determine suggested action
|
|
259
|
+
let suggestedAction;
|
|
260
|
+
if (approvalRate > 0.9 && total >= 3) {
|
|
261
|
+
suggestedAction = 'allow';
|
|
262
|
+
}
|
|
263
|
+
else if (denialRate > 0.9 && total >= 3) {
|
|
264
|
+
suggestedAction = 'deny';
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
suggestedAction = 'prompt';
|
|
268
|
+
}
|
|
269
|
+
// Calculate average decision time
|
|
270
|
+
const timesWithDecision = records
|
|
271
|
+
.filter(r => r.decisionTimeMs !== undefined)
|
|
272
|
+
.map(r => r.decisionTimeMs);
|
|
273
|
+
const avgDecisionTimeMs = timesWithDecision.length > 0
|
|
274
|
+
? timesWithDecision.reduce((a, b) => a + b, 0) / timesWithDecision.length
|
|
275
|
+
: undefined;
|
|
276
|
+
// Build context summary
|
|
277
|
+
const contextSummary = buildContextSummary(records);
|
|
278
|
+
// Sort by timestamp to get first/last seen
|
|
279
|
+
const sorted = [...records].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
280
|
+
patterns.push({
|
|
281
|
+
pattern,
|
|
282
|
+
frequency: total,
|
|
283
|
+
approvalRate,
|
|
284
|
+
denialRate,
|
|
285
|
+
timeoutRate,
|
|
286
|
+
suggestedAction,
|
|
287
|
+
confidence,
|
|
288
|
+
examples: records.slice(0, 5).map(r => r.command),
|
|
289
|
+
avgDecisionTimeMs,
|
|
290
|
+
lastSeen: new Date(sorted[sorted.length - 1].timestamp),
|
|
291
|
+
firstSeen: new Date(sorted[0].timestamp),
|
|
292
|
+
contextSummary,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Sort by frequency
|
|
296
|
+
return patterns.sort((a, b) => b.frequency - a.frequency);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Build context summary from records.
|
|
300
|
+
*/
|
|
301
|
+
function buildContextSummary(records) {
|
|
302
|
+
const projectTypes = {};
|
|
303
|
+
const riskLevels = {};
|
|
304
|
+
let alternativeChoices = 0;
|
|
305
|
+
for (const record of records) {
|
|
306
|
+
// Project types
|
|
307
|
+
const pt = record.context.projectType || 'unknown';
|
|
308
|
+
projectTypes[pt] = (projectTypes[pt] || 0) + 1;
|
|
309
|
+
// Risk levels
|
|
310
|
+
riskLevels[record.context.riskLevel] =
|
|
311
|
+
(riskLevels[record.context.riskLevel] || 0) + 1;
|
|
312
|
+
// Alternative choices
|
|
313
|
+
if (record.chosenAlternative) {
|
|
314
|
+
alternativeChoices++;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
projectTypes,
|
|
319
|
+
riskLevels,
|
|
320
|
+
alternativeChoiceRate: records.length > 0 ? alternativeChoices / records.length : 0,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Calculate similarity between two patterns.
|
|
325
|
+
*
|
|
326
|
+
* @param pattern1 - First pattern
|
|
327
|
+
* @param pattern2 - Second pattern
|
|
328
|
+
* @returns Similarity score (0-1)
|
|
329
|
+
*/
|
|
330
|
+
export function patternSimilarity(pattern1, pattern2) {
|
|
331
|
+
const parts1 = pattern1.split(' ');
|
|
332
|
+
const parts2 = pattern2.split(' ');
|
|
333
|
+
// Must have same executable
|
|
334
|
+
if (parts1[0] !== parts2[0]) {
|
|
335
|
+
return 0;
|
|
336
|
+
}
|
|
337
|
+
// Count matching parts
|
|
338
|
+
let matches = 1; // executable matches
|
|
339
|
+
const maxParts = Math.max(parts1.length, parts2.length);
|
|
340
|
+
for (let i = 1; i < Math.min(parts1.length, parts2.length); i++) {
|
|
341
|
+
if (parts1[i] === parts2[i]) {
|
|
342
|
+
matches++;
|
|
343
|
+
}
|
|
344
|
+
else if (isPlaceholder(parts1[i]) && isPlaceholder(parts2[i])) {
|
|
345
|
+
// Both are placeholders - partial match
|
|
346
|
+
matches += 0.5;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return matches / maxParts;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Check if a string is a placeholder.
|
|
353
|
+
*/
|
|
354
|
+
function isPlaceholder(s) {
|
|
355
|
+
return s.startsWith('<') && s.endsWith('>');
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Find similar patterns in a list.
|
|
359
|
+
*/
|
|
360
|
+
export function findSimilarPatterns(target, patterns, threshold = 0.7) {
|
|
361
|
+
const results = [];
|
|
362
|
+
for (const pattern of patterns) {
|
|
363
|
+
if (pattern === target)
|
|
364
|
+
continue;
|
|
365
|
+
const similarity = patternSimilarity(target, pattern);
|
|
366
|
+
if (similarity >= threshold) {
|
|
367
|
+
results.push({ pattern, similarity });
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
return results.sort((a, b) => b.similarity - a.similarity);
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=pattern-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-extractor.js","sourceRoot":"","sources":["../../../src/guard/learning/pattern-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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 type { ApprovalRecord, LearnedPattern, RuleSuggestion, LearningConfig } from './types.js';
|
|
8
|
+
import type { GuardConfig, GuardRule } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Result of analyzing patterns for rule suggestions.
|
|
11
|
+
*/
|
|
12
|
+
export interface SuggestionAnalysis {
|
|
13
|
+
/** Generated suggestions */
|
|
14
|
+
suggestions: RuleSuggestion[];
|
|
15
|
+
/** Patterns that need more data */
|
|
16
|
+
insufficientData: Array<{
|
|
17
|
+
pattern: string;
|
|
18
|
+
occurrences: number;
|
|
19
|
+
needed: number;
|
|
20
|
+
}>;
|
|
21
|
+
/** Patterns that are too inconsistent */
|
|
22
|
+
inconsistent: Array<{
|
|
23
|
+
pattern: string;
|
|
24
|
+
approvalRate: number;
|
|
25
|
+
denialRate: number;
|
|
26
|
+
}>;
|
|
27
|
+
/** Summary statistics */
|
|
28
|
+
stats: {
|
|
29
|
+
patternsAnalyzed: number;
|
|
30
|
+
suggestionsGenerated: number;
|
|
31
|
+
highConfidenceSuggestions: number;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Analyze approval history and suggest rules.
|
|
36
|
+
*
|
|
37
|
+
* @param records - Approval history records
|
|
38
|
+
* @param existingConfig - Current guard config (to avoid duplicate rules)
|
|
39
|
+
* @param config - Learning configuration
|
|
40
|
+
* @returns Analysis result with suggestions
|
|
41
|
+
*/
|
|
42
|
+
export declare function analyzeAndSuggest(records: ApprovalRecord[], existingConfig?: GuardConfig, config?: LearningConfig): SuggestionAnalysis;
|
|
43
|
+
/**
|
|
44
|
+
* Convert a rule suggestion to a guard rule.
|
|
45
|
+
*/
|
|
46
|
+
export declare function suggestionToRule(suggestion: RuleSuggestion): GuardRule;
|
|
47
|
+
/**
|
|
48
|
+
* Format suggestions for display.
|
|
49
|
+
*/
|
|
50
|
+
export declare function formatSuggestions(suggestions: RuleSuggestion[]): string;
|
|
51
|
+
/**
|
|
52
|
+
* Export suggestions as YAML rules.
|
|
53
|
+
*/
|
|
54
|
+
export declare function exportSuggestionsAsYaml(suggestions: RuleSuggestion[]): string;
|
|
55
|
+
/**
|
|
56
|
+
* Merge suggestions with existing config.
|
|
57
|
+
*/
|
|
58
|
+
export declare function mergeSuggestionsWithConfig(suggestions: RuleSuggestion[], config: GuardConfig): GuardConfig;
|
|
59
|
+
/**
|
|
60
|
+
* Find patterns that might benefit from more specific rules.
|
|
61
|
+
*/
|
|
62
|
+
export declare function findRefinementOpportunities(patterns: LearnedPattern[]): Array<{
|
|
63
|
+
pattern: string;
|
|
64
|
+
reason: string;
|
|
65
|
+
suggestion: string;
|
|
66
|
+
}>;
|
|
67
|
+
//# sourceMappingURL=rule-suggester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-suggester.d.ts","sourceRoot":"","sources":["../../../src/guard/learning/rule-suggester.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,cAAc,EAEd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG1D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,mCAAmC;IACnC,gBAAgB,EAAE,KAAK,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,yCAAyC;IACzC,YAAY,EAAE,KAAK,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,yBAAyB;IACzB,KAAK,EAAE;QACL,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yBAAyB,EAAE,MAAM,CAAC;KACnC,CAAC;CACH;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,cAAc,EAAE,EACzB,cAAc,CAAC,EAAE,WAAW,EAC5B,MAAM,GAAE,cAAwC,GAC/C,kBAAkB,CA6EpB;AA2KD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,cAAc,GAAG,SAAS,CAyBtE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,CAsBvE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,CA6B7E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,cAAc,EAAE,EAC7B,MAAM,EAAE,WAAW,GAClB,WAAW,CAUb;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,cAAc,EAAE,GACzB,KAAK,CAAC;IACP,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAyCD"}
|