@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.
Files changed (194) hide show
  1. package/README.md +138 -0
  2. package/dist/analyzers/filesystem.d.ts +5 -0
  3. package/dist/analyzers/filesystem.d.ts.map +1 -1
  4. package/dist/analyzers/filesystem.js +61 -7
  5. package/dist/analyzers/filesystem.js.map +1 -1
  6. package/dist/analyzers/loader.d.ts +5 -0
  7. package/dist/analyzers/loader.d.ts.map +1 -1
  8. package/dist/analyzers/loader.js +112 -6
  9. package/dist/analyzers/loader.js.map +1 -1
  10. package/dist/analyzers/prompt-injection.d.ts +1 -0
  11. package/dist/analyzers/prompt-injection.d.ts.map +1 -1
  12. package/dist/analyzers/prompt-injection.js +48 -2
  13. package/dist/analyzers/prompt-injection.js.map +1 -1
  14. package/dist/analyzers/shell.d.ts +8 -0
  15. package/dist/analyzers/shell.d.ts.map +1 -1
  16. package/dist/analyzers/shell.js +109 -8
  17. package/dist/analyzers/shell.js.map +1 -1
  18. package/dist/analyzers/sql.d.ts.map +1 -1
  19. package/dist/analyzers/sql.js +8 -7
  20. package/dist/analyzers/sql.js.map +1 -1
  21. package/dist/approval/interactive.d.ts +1 -1
  22. package/dist/approval/interactive.d.ts.map +1 -1
  23. package/dist/approval/interactive.js +13 -1
  24. package/dist/approval/interactive.js.map +1 -1
  25. package/dist/approval/rate-limiter.d.ts +115 -0
  26. package/dist/approval/rate-limiter.d.ts.map +1 -0
  27. package/dist/approval/rate-limiter.js +200 -0
  28. package/dist/approval/rate-limiter.js.map +1 -0
  29. package/dist/approval/url-validator.d.ts +51 -0
  30. package/dist/approval/url-validator.d.ts.map +1 -0
  31. package/dist/approval/url-validator.js +184 -0
  32. package/dist/approval/url-validator.js.map +1 -0
  33. package/dist/approval/webhook.d.ts +48 -0
  34. package/dist/approval/webhook.d.ts.map +1 -1
  35. package/dist/approval/webhook.js +89 -0
  36. package/dist/approval/webhook.js.map +1 -1
  37. package/dist/audit/integrity.d.ts +107 -0
  38. package/dist/audit/integrity.d.ts.map +1 -0
  39. package/dist/audit/integrity.js +191 -0
  40. package/dist/audit/integrity.js.map +1 -0
  41. package/dist/audit/logger.d.ts.map +1 -1
  42. package/dist/audit/logger.js +6 -5
  43. package/dist/audit/logger.js.map +1 -1
  44. package/dist/audit/redaction.js +6 -4
  45. package/dist/audit/redaction.js.map +1 -1
  46. package/dist/cli/commands/guard.d.ts +97 -0
  47. package/dist/cli/commands/guard.d.ts.map +1 -0
  48. package/dist/cli/commands/guard.js +456 -0
  49. package/dist/cli/commands/guard.js.map +1 -0
  50. package/dist/cli/commands/serve.js +1 -1
  51. package/dist/cli/commands/serve.js.map +1 -1
  52. package/dist/cli/index.js +3 -0
  53. package/dist/cli/index.js.map +1 -1
  54. package/dist/cli/input-validation.d.ts +83 -0
  55. package/dist/cli/input-validation.d.ts.map +1 -0
  56. package/dist/cli/input-validation.js +237 -0
  57. package/dist/cli/input-validation.js.map +1 -0
  58. package/dist/cli/ui.js +2 -2
  59. package/dist/cli/ui.js.map +1 -1
  60. package/dist/guard/alternatives/index.d.ts +68 -0
  61. package/dist/guard/alternatives/index.d.ts.map +1 -0
  62. package/dist/guard/alternatives/index.js +224 -0
  63. package/dist/guard/alternatives/index.js.map +1 -0
  64. package/dist/guard/alternatives/registry.d.ts +16 -0
  65. package/dist/guard/alternatives/registry.d.ts.map +1 -0
  66. package/dist/guard/alternatives/registry.js +518 -0
  67. package/dist/guard/alternatives/registry.js.map +1 -0
  68. package/dist/guard/alternatives/types.d.ts +86 -0
  69. package/dist/guard/alternatives/types.d.ts.map +1 -0
  70. package/dist/guard/alternatives/types.js +5 -0
  71. package/dist/guard/alternatives/types.js.map +1 -0
  72. package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
  73. package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
  74. package/dist/guard/approval/enhanced-terminal.js +387 -0
  75. package/dist/guard/approval/enhanced-terminal.js.map +1 -0
  76. package/dist/guard/config.d.ts +80 -0
  77. package/dist/guard/config.d.ts.map +1 -0
  78. package/dist/guard/config.js +260 -0
  79. package/dist/guard/config.js.map +1 -0
  80. package/dist/guard/context/directory.d.ts +35 -0
  81. package/dist/guard/context/directory.d.ts.map +1 -0
  82. package/dist/guard/context/directory.js +243 -0
  83. package/dist/guard/context/directory.js.map +1 -0
  84. package/dist/guard/context/environment.d.ts +31 -0
  85. package/dist/guard/context/environment.d.ts.map +1 -0
  86. package/dist/guard/context/environment.js +204 -0
  87. package/dist/guard/context/environment.js.map +1 -0
  88. package/dist/guard/context/git.d.ts +52 -0
  89. package/dist/guard/context/git.d.ts.map +1 -0
  90. package/dist/guard/context/git.js +278 -0
  91. package/dist/guard/context/git.js.map +1 -0
  92. package/dist/guard/context/index.d.ts +64 -0
  93. package/dist/guard/context/index.d.ts.map +1 -0
  94. package/dist/guard/context/index.js +227 -0
  95. package/dist/guard/context/index.js.map +1 -0
  96. package/dist/guard/context/project.d.ts +47 -0
  97. package/dist/guard/context/project.d.ts.map +1 -0
  98. package/dist/guard/context/project.js +281 -0
  99. package/dist/guard/context/project.js.map +1 -0
  100. package/dist/guard/context/types.d.ts +152 -0
  101. package/dist/guard/context/types.d.ts.map +1 -0
  102. package/dist/guard/context/types.js +7 -0
  103. package/dist/guard/context/types.js.map +1 -0
  104. package/dist/guard/engine.d.ts +107 -0
  105. package/dist/guard/engine.d.ts.map +1 -0
  106. package/dist/guard/engine.js +430 -0
  107. package/dist/guard/engine.js.map +1 -0
  108. package/dist/guard/enhanced-engine.d.ts +151 -0
  109. package/dist/guard/enhanced-engine.d.ts.map +1 -0
  110. package/dist/guard/enhanced-engine.js +622 -0
  111. package/dist/guard/enhanced-engine.js.map +1 -0
  112. package/dist/guard/hooks/index.d.ts +50 -0
  113. package/dist/guard/hooks/index.d.ts.map +1 -0
  114. package/dist/guard/hooks/index.js +325 -0
  115. package/dist/guard/hooks/index.js.map +1 -0
  116. package/dist/guard/index.d.ts +29 -0
  117. package/dist/guard/index.d.ts.map +1 -0
  118. package/dist/guard/index.js +31 -0
  119. package/dist/guard/index.js.map +1 -0
  120. package/dist/guard/learning/index.d.ts +136 -0
  121. package/dist/guard/learning/index.d.ts.map +1 -0
  122. package/dist/guard/learning/index.js +314 -0
  123. package/dist/guard/learning/index.js.map +1 -0
  124. package/dist/guard/learning/pattern-extractor.d.ts +50 -0
  125. package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
  126. package/dist/guard/learning/pattern-extractor.js +372 -0
  127. package/dist/guard/learning/pattern-extractor.js.map +1 -0
  128. package/dist/guard/learning/rule-suggester.d.ts +67 -0
  129. package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
  130. package/dist/guard/learning/rule-suggester.js +345 -0
  131. package/dist/guard/learning/rule-suggester.js.map +1 -0
  132. package/dist/guard/learning/types.d.ts +211 -0
  133. package/dist/guard/learning/types.d.ts.map +1 -0
  134. package/dist/guard/learning/types.js +18 -0
  135. package/dist/guard/learning/types.js.map +1 -0
  136. package/dist/guard/preview/effects.d.ts +15 -0
  137. package/dist/guard/preview/effects.d.ts.map +1 -0
  138. package/dist/guard/preview/effects.js +413 -0
  139. package/dist/guard/preview/effects.js.map +1 -0
  140. package/dist/guard/preview/index.d.ts +49 -0
  141. package/dist/guard/preview/index.d.ts.map +1 -0
  142. package/dist/guard/preview/index.js +196 -0
  143. package/dist/guard/preview/index.js.map +1 -0
  144. package/dist/guard/preview/parser.d.ts +34 -0
  145. package/dist/guard/preview/parser.d.ts.map +1 -0
  146. package/dist/guard/preview/parser.js +292 -0
  147. package/dist/guard/preview/parser.js.map +1 -0
  148. package/dist/guard/preview/types.d.ts +140 -0
  149. package/dist/guard/preview/types.d.ts.map +1 -0
  150. package/dist/guard/preview/types.js +5 -0
  151. package/dist/guard/preview/types.js.map +1 -0
  152. package/dist/guard/reversibility/index.d.ts +88 -0
  153. package/dist/guard/reversibility/index.d.ts.map +1 -0
  154. package/dist/guard/reversibility/index.js +310 -0
  155. package/dist/guard/reversibility/index.js.map +1 -0
  156. package/dist/guard/types.d.ts +192 -0
  157. package/dist/guard/types.d.ts.map +1 -0
  158. package/dist/guard/types.js +8 -0
  159. package/dist/guard/types.js.map +1 -0
  160. package/dist/index.d.ts +10 -0
  161. package/dist/index.d.ts.map +1 -1
  162. package/dist/index.js +24 -0
  163. package/dist/index.js.map +1 -1
  164. package/dist/orchestrator/manager.d.ts.map +1 -1
  165. package/dist/orchestrator/manager.js +6 -1
  166. package/dist/orchestrator/manager.js.map +1 -1
  167. package/dist/policy/engine.d.ts.map +1 -1
  168. package/dist/policy/engine.js +11 -3
  169. package/dist/policy/engine.js.map +1 -1
  170. package/dist/policy/parser.d.ts.map +1 -1
  171. package/dist/policy/parser.js +3 -0
  172. package/dist/policy/parser.js.map +1 -1
  173. package/dist/proxy/server.d.ts.map +1 -1
  174. package/dist/proxy/server.js +8 -6
  175. package/dist/proxy/server.js.map +1 -1
  176. package/dist/session/manager.d.ts +2 -2
  177. package/dist/session/manager.d.ts.map +1 -1
  178. package/dist/session/manager.js +106 -88
  179. package/dist/session/manager.js.map +1 -1
  180. package/dist/session/signing.d.ts +88 -0
  181. package/dist/session/signing.d.ts.map +1 -0
  182. package/dist/session/signing.js +166 -0
  183. package/dist/session/signing.js.map +1 -0
  184. package/dist/session/types.d.ts +2 -0
  185. package/dist/session/types.d.ts.map +1 -1
  186. package/dist/session/types.js.map +1 -1
  187. package/dist/utils/security-logger.d.ts +146 -0
  188. package/dist/utils/security-logger.d.ts.map +1 -0
  189. package/dist/utils/security-logger.js +222 -0
  190. package/dist/utils/security-logger.js.map +1 -0
  191. package/dist/wizard.d.ts.map +1 -1
  192. package/dist/wizard.js +7 -1
  193. package/dist/wizard.js.map +1 -1
  194. 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"}