@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,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard Configuration
|
|
3
|
+
*
|
|
4
|
+
* Handles loading and validation of guard configuration from:
|
|
5
|
+
* 1. ~/.config/tollgate/guard.yaml (user config)
|
|
6
|
+
* 2. ./tollgate.yaml (project config)
|
|
7
|
+
* 3. CLI options (highest priority)
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { parse as parseYaml } from 'yaml';
|
|
13
|
+
/**
|
|
14
|
+
* Default risk action mapping.
|
|
15
|
+
*
|
|
16
|
+
* - safe/read: Allow without prompt (common dev commands)
|
|
17
|
+
* - write: Prompt for approval (file modifications)
|
|
18
|
+
* - destructive: Prompt for approval (deletions, overwrites)
|
|
19
|
+
* - dangerous: Always deny (system damage potential)
|
|
20
|
+
*/
|
|
21
|
+
export const DEFAULT_RISK_ACTIONS = {
|
|
22
|
+
safe: 'allow',
|
|
23
|
+
read: 'allow',
|
|
24
|
+
write: 'prompt',
|
|
25
|
+
destructive: 'prompt',
|
|
26
|
+
dangerous: 'deny',
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Default session configuration.
|
|
30
|
+
*/
|
|
31
|
+
export const DEFAULT_SESSION_CONFIG = {
|
|
32
|
+
allowRemember: true,
|
|
33
|
+
defaultScope: 'tool',
|
|
34
|
+
allowedDurations: ['once', '5min', '15min', 'session'],
|
|
35
|
+
persistSessions: false,
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Default fast path configuration.
|
|
39
|
+
*
|
|
40
|
+
* These command prefixes skip analysis entirely for performance.
|
|
41
|
+
* Only truly safe, read-only commands should be included.
|
|
42
|
+
*/
|
|
43
|
+
export const DEFAULT_FAST_PATH_CONFIG = {
|
|
44
|
+
enabled: true,
|
|
45
|
+
safePrefixes: [
|
|
46
|
+
// Navigation & listing
|
|
47
|
+
'ls', 'cd', 'pwd', 'tree',
|
|
48
|
+
// Reading
|
|
49
|
+
'cat', 'less', 'more', 'head', 'tail', 'bat',
|
|
50
|
+
// Searching (read-only)
|
|
51
|
+
'grep', 'rg', 'ag', 'find', 'fd', 'which', 'whereis', 'type', 'file',
|
|
52
|
+
// Help & info
|
|
53
|
+
'man', 'help', 'info', 'tldr',
|
|
54
|
+
// History & shell builtins
|
|
55
|
+
'history', 'alias', 'echo', 'printf',
|
|
56
|
+
// Version checking
|
|
57
|
+
'node --version', 'npm --version', 'python --version', 'go version',
|
|
58
|
+
'git --version', 'rustc --version', 'cargo --version',
|
|
59
|
+
// Git read-only
|
|
60
|
+
'git status', 'git diff', 'git log', 'git branch', 'git show',
|
|
61
|
+
'git remote -v', 'git stash list',
|
|
62
|
+
// Package info (read-only)
|
|
63
|
+
'npm list', 'npm ls', 'npm outdated', 'pip list', 'pip show',
|
|
64
|
+
// Environment
|
|
65
|
+
'env', 'printenv', 'whoami', 'id', 'hostname', 'uname',
|
|
66
|
+
// Date/time
|
|
67
|
+
'date', 'cal', 'uptime',
|
|
68
|
+
],
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Default audit configuration.
|
|
72
|
+
*/
|
|
73
|
+
export const DEFAULT_AUDIT_CONFIG = {
|
|
74
|
+
enabled: true,
|
|
75
|
+
logAllCommands: false, // Only log prompted/denied by default
|
|
76
|
+
redactSecrets: true,
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Default UI configuration.
|
|
80
|
+
*/
|
|
81
|
+
export const DEFAULT_UI_CONFIG = {
|
|
82
|
+
showRiskLevel: true,
|
|
83
|
+
showPattern: false, // Can be noisy
|
|
84
|
+
showCategory: true,
|
|
85
|
+
colors: true,
|
|
86
|
+
timeout: 60, // 60 seconds
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Complete default guard configuration.
|
|
90
|
+
*/
|
|
91
|
+
export const DEFAULT_GUARD_CONFIG = {
|
|
92
|
+
enabled: true,
|
|
93
|
+
risks: DEFAULT_RISK_ACTIONS,
|
|
94
|
+
session: DEFAULT_SESSION_CONFIG,
|
|
95
|
+
rules: [],
|
|
96
|
+
allowlist: [],
|
|
97
|
+
denylist: [],
|
|
98
|
+
fastPath: DEFAULT_FAST_PATH_CONFIG,
|
|
99
|
+
audit: DEFAULT_AUDIT_CONFIG,
|
|
100
|
+
ui: DEFAULT_UI_CONFIG,
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Configuration file paths in order of precedence (lowest to highest).
|
|
104
|
+
*/
|
|
105
|
+
export function getConfigPaths() {
|
|
106
|
+
const paths = [];
|
|
107
|
+
// User-level config
|
|
108
|
+
const userConfig = join(homedir(), '.config', 'tollgate', 'guard.yaml');
|
|
109
|
+
if (existsSync(userConfig)) {
|
|
110
|
+
paths.push(userConfig);
|
|
111
|
+
}
|
|
112
|
+
// Project-level config (tollgate.yaml with guard section)
|
|
113
|
+
const projectConfig = join(process.cwd(), 'tollgate.yaml');
|
|
114
|
+
if (existsSync(projectConfig)) {
|
|
115
|
+
paths.push(projectConfig);
|
|
116
|
+
}
|
|
117
|
+
return paths;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Load guard configuration from a YAML file.
|
|
121
|
+
*/
|
|
122
|
+
export function loadConfigFromFile(path) {
|
|
123
|
+
try {
|
|
124
|
+
const content = readFileSync(path, 'utf8');
|
|
125
|
+
const parsed = parseYaml(content);
|
|
126
|
+
// Config might be at root or under 'guard' key
|
|
127
|
+
if (parsed?.guard) {
|
|
128
|
+
return parsed.guard;
|
|
129
|
+
}
|
|
130
|
+
// If it looks like a guard config at root level
|
|
131
|
+
if (parsed?.risks || parsed?.rules || parsed?.allowlist) {
|
|
132
|
+
return parsed;
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Deep merge two objects, with source taking precedence.
|
|
142
|
+
*/
|
|
143
|
+
function deepMerge(target, source) {
|
|
144
|
+
const result = { ...target };
|
|
145
|
+
for (const key of Object.keys(source)) {
|
|
146
|
+
const sourceValue = source[key];
|
|
147
|
+
const targetValue = target[key];
|
|
148
|
+
if (sourceValue !== undefined &&
|
|
149
|
+
typeof sourceValue === 'object' &&
|
|
150
|
+
sourceValue !== null &&
|
|
151
|
+
!Array.isArray(sourceValue) &&
|
|
152
|
+
typeof targetValue === 'object' &&
|
|
153
|
+
targetValue !== null &&
|
|
154
|
+
!Array.isArray(targetValue)) {
|
|
155
|
+
// Recursively merge objects
|
|
156
|
+
result[key] = deepMerge(targetValue, sourceValue);
|
|
157
|
+
}
|
|
158
|
+
else if (sourceValue !== undefined) {
|
|
159
|
+
// Override with source value
|
|
160
|
+
result[key] = sourceValue;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Load and merge guard configuration from all sources.
|
|
167
|
+
*
|
|
168
|
+
* Priority (lowest to highest):
|
|
169
|
+
* 1. Default configuration
|
|
170
|
+
* 2. User config (~/.config/tollgate/guard.yaml)
|
|
171
|
+
* 3. Project config (./tollgate.yaml)
|
|
172
|
+
* 4. CLI options (passed via overrides)
|
|
173
|
+
*/
|
|
174
|
+
export function loadGuardConfig(overrides) {
|
|
175
|
+
let config = { ...DEFAULT_GUARD_CONFIG };
|
|
176
|
+
// Load from config files
|
|
177
|
+
const configPaths = getConfigPaths();
|
|
178
|
+
for (const path of configPaths) {
|
|
179
|
+
const fileConfig = loadConfigFromFile(path);
|
|
180
|
+
if (fileConfig) {
|
|
181
|
+
config = deepMerge(config, fileConfig);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Apply CLI overrides
|
|
185
|
+
if (overrides) {
|
|
186
|
+
config = deepMerge(config, overrides);
|
|
187
|
+
}
|
|
188
|
+
return config;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Validate guard configuration.
|
|
192
|
+
*/
|
|
193
|
+
export function validateGuardConfig(config) {
|
|
194
|
+
const errors = [];
|
|
195
|
+
// Validate risk mapping
|
|
196
|
+
const validRisks = ['safe', 'read', 'write', 'destructive', 'dangerous'];
|
|
197
|
+
const validActions = ['allow', 'prompt', 'deny'];
|
|
198
|
+
for (const [risk, action] of Object.entries(config.risks)) {
|
|
199
|
+
if (!validRisks.includes(risk)) {
|
|
200
|
+
errors.push(`Invalid risk level: ${risk}`);
|
|
201
|
+
}
|
|
202
|
+
if (!validActions.includes(action)) {
|
|
203
|
+
errors.push(`Invalid action for ${risk}: ${action}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Validate rules
|
|
207
|
+
for (const rule of config.rules) {
|
|
208
|
+
try {
|
|
209
|
+
new RegExp(rule.pattern);
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
errors.push(`Invalid regex pattern in rule: ${rule.pattern}`);
|
|
213
|
+
}
|
|
214
|
+
if (!validActions.includes(rule.action)) {
|
|
215
|
+
errors.push(`Invalid action in rule: ${rule.action}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Validate denylist patterns
|
|
219
|
+
for (const deny of config.denylist) {
|
|
220
|
+
try {
|
|
221
|
+
new RegExp(deny.pattern);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
errors.push(`Invalid regex pattern in denylist: ${deny.pattern}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Validate session config
|
|
228
|
+
const validScopes = ['exact', 'tool', 'server', 'pattern'];
|
|
229
|
+
if (!validScopes.includes(config.session.defaultScope)) {
|
|
230
|
+
errors.push(`Invalid default scope: ${config.session.defaultScope}`);
|
|
231
|
+
}
|
|
232
|
+
const validDurations = ['once', '5min', '15min', '30min', 'session'];
|
|
233
|
+
for (const duration of config.session.allowedDurations) {
|
|
234
|
+
if (!validDurations.includes(duration)) {
|
|
235
|
+
errors.push(`Invalid duration: ${duration}`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Validate UI timeout
|
|
239
|
+
if (config.ui.timeout < 1 || config.ui.timeout > 300) {
|
|
240
|
+
errors.push(`Timeout must be between 1 and 300 seconds, got: ${config.ui.timeout}`);
|
|
241
|
+
}
|
|
242
|
+
return errors;
|
|
243
|
+
}
|
|
244
|
+
export function compileRules(rules) {
|
|
245
|
+
return rules
|
|
246
|
+
.map((rule) => ({
|
|
247
|
+
...rule,
|
|
248
|
+
pattern: new RegExp(rule.pattern, 'i'),
|
|
249
|
+
originalPattern: rule.pattern,
|
|
250
|
+
}))
|
|
251
|
+
.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)); // Higher priority first
|
|
252
|
+
}
|
|
253
|
+
export function compileDenylist(denylist) {
|
|
254
|
+
return denylist.map((deny) => ({
|
|
255
|
+
...deny,
|
|
256
|
+
pattern: new RegExp(deny.pattern, 'i'),
|
|
257
|
+
originalPattern: deny.pattern,
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/guard/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory Sensitivity Scoring for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Evaluates how sensitive a directory is to help with risk assessment.
|
|
5
|
+
*/
|
|
6
|
+
import type { DirectoryContext, ProjectContext } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Score directory sensitivity.
|
|
9
|
+
*
|
|
10
|
+
* @param targetPath - Path to evaluate
|
|
11
|
+
* @param project - Optional project context
|
|
12
|
+
* @returns Directory context with sensitivity information
|
|
13
|
+
*/
|
|
14
|
+
export declare function scoreSensitivity(targetPath: string, project?: ProjectContext): DirectoryContext;
|
|
15
|
+
/**
|
|
16
|
+
* Get sensitive paths that would be affected by operating on a directory.
|
|
17
|
+
*
|
|
18
|
+
* @param targetPath - Path to check
|
|
19
|
+
* @returns List of sensitive paths that would be affected
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSensitivePathsAffected(targetPath: string): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Get a human-readable description of why a path is sensitive.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getSensitivityDescription(context: DirectoryContext): string;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a path should trigger extra confirmation.
|
|
28
|
+
*/
|
|
29
|
+
export declare function requiresExtraConfirmation(context: DirectoryContext): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get the relative risk modifier based on sensitivity.
|
|
32
|
+
* Returns a multiplier for risk scoring.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getSensitivityRiskModifier(context: DirectoryContext): number;
|
|
35
|
+
//# sourceMappingURL=directory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory.d.ts","sourceRoot":"","sources":["../../../src/guard/context/directory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAmFnE;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,cAAc,GACvB,gBAAgB,CAiFlB;AAwBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAoBtE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAc3E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAE5E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAM5E"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory Sensitivity Scoring for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Evaluates how sensitive a directory is to help with risk assessment.
|
|
5
|
+
*/
|
|
6
|
+
import { resolve } from 'node:path';
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
/**
|
|
9
|
+
* Sensitive paths categorized by severity.
|
|
10
|
+
*/
|
|
11
|
+
const SENSITIVE_PATHS = {
|
|
12
|
+
/** Critical system paths - never modify */
|
|
13
|
+
critical: [
|
|
14
|
+
'/',
|
|
15
|
+
'/etc',
|
|
16
|
+
'/usr',
|
|
17
|
+
'/bin',
|
|
18
|
+
'/sbin',
|
|
19
|
+
'/boot',
|
|
20
|
+
'/var',
|
|
21
|
+
'/root',
|
|
22
|
+
'/lib',
|
|
23
|
+
'/lib64',
|
|
24
|
+
'/opt',
|
|
25
|
+
'/srv',
|
|
26
|
+
'/sys',
|
|
27
|
+
'/proc',
|
|
28
|
+
'/dev',
|
|
29
|
+
],
|
|
30
|
+
/** High sensitivity - user config and security */
|
|
31
|
+
high: [
|
|
32
|
+
'~/.ssh',
|
|
33
|
+
'~/.gnupg',
|
|
34
|
+
'~/.gpg',
|
|
35
|
+
'~/.config',
|
|
36
|
+
'~/.local/share',
|
|
37
|
+
'~/.aws',
|
|
38
|
+
'~/.azure',
|
|
39
|
+
'~/.gcloud',
|
|
40
|
+
'~/.kube',
|
|
41
|
+
'~/.docker',
|
|
42
|
+
'~/.npmrc',
|
|
43
|
+
'~/.pypirc',
|
|
44
|
+
'~/.netrc',
|
|
45
|
+
'~/.gitconfig',
|
|
46
|
+
'~/.git-credentials',
|
|
47
|
+
'~/.bash_history',
|
|
48
|
+
'~/.zsh_history',
|
|
49
|
+
'~/.password-store',
|
|
50
|
+
'~/.vault-token',
|
|
51
|
+
],
|
|
52
|
+
/** Medium sensitivity - user data */
|
|
53
|
+
medium: [
|
|
54
|
+
'~',
|
|
55
|
+
'~/Documents',
|
|
56
|
+
'~/Desktop',
|
|
57
|
+
'~/Pictures',
|
|
58
|
+
'~/Music',
|
|
59
|
+
'~/Videos',
|
|
60
|
+
'~/Downloads',
|
|
61
|
+
'~/Library', // macOS
|
|
62
|
+
],
|
|
63
|
+
/** Low sensitivity - temp/cache */
|
|
64
|
+
low: [
|
|
65
|
+
'/tmp',
|
|
66
|
+
'/var/tmp',
|
|
67
|
+
'~/.cache',
|
|
68
|
+
'~/.local/cache',
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Expand ~ to home directory.
|
|
73
|
+
*/
|
|
74
|
+
function expandPath(path) {
|
|
75
|
+
const home = homedir();
|
|
76
|
+
if (path.startsWith('~/')) {
|
|
77
|
+
return resolve(home, path.slice(2));
|
|
78
|
+
}
|
|
79
|
+
if (path === '~') {
|
|
80
|
+
return home;
|
|
81
|
+
}
|
|
82
|
+
return resolve(path);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Score directory sensitivity.
|
|
86
|
+
*
|
|
87
|
+
* @param targetPath - Path to evaluate
|
|
88
|
+
* @param project - Optional project context
|
|
89
|
+
* @returns Directory context with sensitivity information
|
|
90
|
+
*/
|
|
91
|
+
export function scoreSensitivity(targetPath, project) {
|
|
92
|
+
const resolvedTarget = resolve(targetPath);
|
|
93
|
+
const home = homedir();
|
|
94
|
+
const reasons = [];
|
|
95
|
+
let sensitivity = 0;
|
|
96
|
+
// Check critical paths (100 sensitivity)
|
|
97
|
+
for (const criticalPath of SENSITIVE_PATHS.critical) {
|
|
98
|
+
const expanded = expandPath(criticalPath);
|
|
99
|
+
if (isPathMatch(resolvedTarget, expanded)) {
|
|
100
|
+
sensitivity = Math.max(sensitivity, 100);
|
|
101
|
+
reasons.push(`Critical system path: ${criticalPath}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Check high sensitivity paths (80 sensitivity)
|
|
105
|
+
for (const highPath of SENSITIVE_PATHS.high) {
|
|
106
|
+
const expanded = expandPath(highPath);
|
|
107
|
+
if (isPathMatch(resolvedTarget, expanded)) {
|
|
108
|
+
sensitivity = Math.max(sensitivity, 80);
|
|
109
|
+
reasons.push(`Sensitive config/credentials: ${highPath}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Check medium sensitivity paths (50 sensitivity)
|
|
113
|
+
for (const mediumPath of SENSITIVE_PATHS.medium) {
|
|
114
|
+
const expanded = expandPath(mediumPath);
|
|
115
|
+
if (isPathMatch(resolvedTarget, expanded)) {
|
|
116
|
+
sensitivity = Math.max(sensitivity, 50);
|
|
117
|
+
reasons.push(`User data directory: ${mediumPath}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Check low sensitivity paths (10 sensitivity)
|
|
121
|
+
for (const lowPath of SENSITIVE_PATHS.low) {
|
|
122
|
+
const expanded = expandPath(lowPath);
|
|
123
|
+
if (isPathMatch(resolvedTarget, expanded)) {
|
|
124
|
+
sensitivity = Math.min(sensitivity, 10); // Lower if in temp
|
|
125
|
+
reasons.push(`Temporary/cache directory: ${lowPath}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Check if in project
|
|
129
|
+
const isInProject = project
|
|
130
|
+
? isPathMatch(resolvedTarget, project.root) || resolvedTarget.startsWith(project.root + '/')
|
|
131
|
+
: false;
|
|
132
|
+
if (isInProject && project) {
|
|
133
|
+
// Reduce sensitivity for project directories
|
|
134
|
+
if (sensitivity > 30) {
|
|
135
|
+
sensitivity = 30;
|
|
136
|
+
reasons.push(`Inside project: ${project.name || project.root}`);
|
|
137
|
+
}
|
|
138
|
+
// Further reduce for regenerable directories
|
|
139
|
+
const { isRegenerablePath } = require('./project.js');
|
|
140
|
+
if (isRegenerablePath(resolvedTarget, project)) {
|
|
141
|
+
sensitivity = Math.min(sensitivity, 10);
|
|
142
|
+
reasons.push('Regenerable directory (can be recreated by package manager)');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Default sensitivity for unknown paths
|
|
146
|
+
if (sensitivity === 0 && reasons.length === 0) {
|
|
147
|
+
sensitivity = 20;
|
|
148
|
+
reasons.push('Standard directory');
|
|
149
|
+
}
|
|
150
|
+
// Determine path characteristics
|
|
151
|
+
const isHome = resolvedTarget === home || resolvedTarget.startsWith(home + '/');
|
|
152
|
+
const isSystem = SENSITIVE_PATHS.critical.some(p => isPathMatch(resolvedTarget, expandPath(p)));
|
|
153
|
+
const isTemp = SENSITIVE_PATHS.low.some(p => isPathMatch(resolvedTarget, expandPath(p)));
|
|
154
|
+
return {
|
|
155
|
+
sensitivity,
|
|
156
|
+
sensitivityReasons: reasons,
|
|
157
|
+
isHome,
|
|
158
|
+
isSystem,
|
|
159
|
+
isInProject,
|
|
160
|
+
isTemp,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if target path matches or is within a sensitive path.
|
|
165
|
+
*/
|
|
166
|
+
function isPathMatch(target, sensitivePath) {
|
|
167
|
+
// Exact match
|
|
168
|
+
if (target === sensitivePath) {
|
|
169
|
+
return true;
|
|
170
|
+
}
|
|
171
|
+
// Target is inside sensitive path
|
|
172
|
+
if (target.startsWith(sensitivePath + '/')) {
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
// Target is a parent of sensitive path (e.g., rm -rf ~ would affect ~/.ssh)
|
|
176
|
+
if (sensitivePath.startsWith(target + '/')) {
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get sensitive paths that would be affected by operating on a directory.
|
|
183
|
+
*
|
|
184
|
+
* @param targetPath - Path to check
|
|
185
|
+
* @returns List of sensitive paths that would be affected
|
|
186
|
+
*/
|
|
187
|
+
export function getSensitivePathsAffected(targetPath) {
|
|
188
|
+
const resolvedTarget = resolve(targetPath);
|
|
189
|
+
const affected = [];
|
|
190
|
+
const allPaths = [
|
|
191
|
+
...SENSITIVE_PATHS.critical,
|
|
192
|
+
...SENSITIVE_PATHS.high,
|
|
193
|
+
...SENSITIVE_PATHS.medium,
|
|
194
|
+
];
|
|
195
|
+
for (const sensitivePath of allPaths) {
|
|
196
|
+
const expanded = expandPath(sensitivePath);
|
|
197
|
+
// Check if sensitive path is inside target
|
|
198
|
+
if (expanded.startsWith(resolvedTarget + '/') || expanded === resolvedTarget) {
|
|
199
|
+
affected.push(sensitivePath);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return affected;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get a human-readable description of why a path is sensitive.
|
|
206
|
+
*/
|
|
207
|
+
export function getSensitivityDescription(context) {
|
|
208
|
+
if (context.sensitivity >= 100) {
|
|
209
|
+
return 'CRITICAL: System-level directory that should never be modified directly';
|
|
210
|
+
}
|
|
211
|
+
if (context.sensitivity >= 80) {
|
|
212
|
+
return 'HIGH: Contains sensitive credentials or security configuration';
|
|
213
|
+
}
|
|
214
|
+
if (context.sensitivity >= 50) {
|
|
215
|
+
return 'MEDIUM: User data directory with potentially important files';
|
|
216
|
+
}
|
|
217
|
+
if (context.sensitivity >= 20) {
|
|
218
|
+
return 'LOW: Standard directory with normal risk level';
|
|
219
|
+
}
|
|
220
|
+
return 'MINIMAL: Temporary or regenerable directory';
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if a path should trigger extra confirmation.
|
|
224
|
+
*/
|
|
225
|
+
export function requiresExtraConfirmation(context) {
|
|
226
|
+
return context.sensitivity >= 50;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get the relative risk modifier based on sensitivity.
|
|
230
|
+
* Returns a multiplier for risk scoring.
|
|
231
|
+
*/
|
|
232
|
+
export function getSensitivityRiskModifier(context) {
|
|
233
|
+
if (context.sensitivity >= 100)
|
|
234
|
+
return 2.0; // Double risk
|
|
235
|
+
if (context.sensitivity >= 80)
|
|
236
|
+
return 1.5; // 50% more risk
|
|
237
|
+
if (context.sensitivity >= 50)
|
|
238
|
+
return 1.2; // 20% more risk
|
|
239
|
+
if (context.sensitivity >= 20)
|
|
240
|
+
return 1.0; // Normal risk
|
|
241
|
+
return 0.5; // Half risk (temp/regenerable)
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory.js","sourceRoot":"","sources":["../../../src/guard/context/directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment Detection for Shell Guardian
|
|
3
|
+
*
|
|
4
|
+
* Detects the execution environment (development, CI, production)
|
|
5
|
+
* to adjust risk assessment accordingly.
|
|
6
|
+
*/
|
|
7
|
+
import type { EnvironmentContext } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect execution environment.
|
|
10
|
+
*
|
|
11
|
+
* @returns Environment context
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectEnvironment(): EnvironmentContext;
|
|
14
|
+
/**
|
|
15
|
+
* Get risk modifier based on environment.
|
|
16
|
+
* Production and CI environments should have stricter controls.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getEnvironmentRiskModifier(env: EnvironmentContext): number;
|
|
19
|
+
/**
|
|
20
|
+
* Check if environment requires extra caution.
|
|
21
|
+
*/
|
|
22
|
+
export declare function requiresExtraCaution(env: EnvironmentContext): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Get warning message for risky environment.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getEnvironmentWarning(env: EnvironmentContext): string | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Check if destructive operations should be blocked.
|
|
29
|
+
*/
|
|
30
|
+
export declare function shouldBlockDestructive(env: EnvironmentContext): boolean;
|
|
31
|
+
//# sourceMappingURL=environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../../../src/guard/context/environment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA+DrD;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,kBAAkB,CAuEtD;AAiBD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAuB1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAIrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAoBjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAGvE"}
|