@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,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"}