driftdetect-mcp 0.1.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 ADDED
@@ -0,0 +1,122 @@
1
+ # Drift MCP Server
2
+
3
+ MCP (Model Context Protocol) server that exposes drift functionality to AI agents like Claude, Kiro, and other MCP-compatible tools.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g driftdetect-mcp
9
+ # or
10
+ pnpm add -g driftdetect-mcp
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ Add to your MCP config (`.kiro/settings/mcp.json` for Kiro, or `~/.config/claude/mcp.json` for Claude Desktop):
16
+
17
+ ```json
18
+ {
19
+ "mcpServers": {
20
+ "drift": {
21
+ "command": "npx",
22
+ "args": ["driftdetect-mcp", "/path/to/your/project"]
23
+ }
24
+ }
25
+ }
26
+ ```
27
+
28
+ Or if installed globally:
29
+
30
+ ```json
31
+ {
32
+ "mcpServers": {
33
+ "drift": {
34
+ "command": "drift-mcp",
35
+ "args": ["/path/to/your/project"]
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ## Available Tools
42
+
43
+ ### `drift_status`
44
+ Get overall codebase pattern health and statistics.
45
+
46
+ ### `drift_patterns`
47
+ Query patterns by category with optional confidence filtering.
48
+
49
+ **Parameters:**
50
+ - `categories` (optional): Array of categories to query
51
+ - `minConfidence` (optional): Minimum confidence score (0.0-1.0)
52
+
53
+ ### `drift_files`
54
+ Get patterns found in a specific file or glob pattern.
55
+
56
+ **Parameters:**
57
+ - `path` (required): File path or glob pattern
58
+ - `category` (optional): Filter by category
59
+
60
+ ### `drift_where`
61
+ Find where a pattern is used across the codebase.
62
+
63
+ **Parameters:**
64
+ - `pattern` (required): Pattern name or ID to search
65
+ - `category` (optional): Filter by category
66
+
67
+ ### `drift_export`
68
+ Export patterns in AI-optimized format for code generation context.
69
+
70
+ **Parameters:**
71
+ - `categories` (optional): Categories to export
72
+ - `format` (optional): `ai-context`, `json`, or `summary`
73
+ - `compact` (optional): Reduce output verbosity
74
+
75
+ ### `drift_contracts`
76
+ Get frontend/backend API contract status and mismatches.
77
+
78
+ **Parameters:**
79
+ - `status` (optional): `all`, `verified`, `mismatch`, or `discovered`
80
+
81
+ ## Categories
82
+
83
+ Drift tracks 15 pattern categories:
84
+ - `api` - API route patterns, response formats
85
+ - `auth` - Authentication and authorization
86
+ - `security` - Security patterns and practices
87
+ - `errors` - Error handling patterns
88
+ - `logging` - Logging conventions
89
+ - `testing` - Test structure and mocking
90
+ - `data-access` - Database and data layer patterns
91
+ - `config` - Configuration management
92
+ - `types` - TypeScript type patterns
93
+ - `structural` - File/folder organization
94
+ - `components` - UI component patterns
95
+ - `styling` - CSS/styling conventions
96
+ - `accessibility` - A11y patterns
97
+ - `documentation` - Doc patterns
98
+ - `performance` - Performance optimizations
99
+
100
+ ## Example Usage
101
+
102
+ Once configured, AI agents can query your codebase patterns:
103
+
104
+ ```
105
+ Agent: "How does this codebase handle authentication?"
106
+ → Uses drift_patterns with categories: ["auth", "security"]
107
+
108
+ Agent: "Show me the API patterns before I add a new endpoint"
109
+ → Uses drift_export with categories: ["api"] and format: "ai-context"
110
+
111
+ Agent: "Are there any API contract mismatches?"
112
+ → Uses drift_contracts with status: "mismatch"
113
+ ```
114
+
115
+ ## Prerequisites
116
+
117
+ Run `drift scan` in your project first to build the pattern database:
118
+
119
+ ```bash
120
+ cd /path/to/your/project
121
+ npx driftdetect scan
122
+ ```
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Drift MCP Server Entry Point
4
+ *
5
+ * Usage:
6
+ * drift-mcp # Run in current directory
7
+ * drift-mcp /path/to/project # Run for specific project
8
+ *
9
+ * MCP Config (add to mcp.json):
10
+ * {
11
+ * "mcpServers": {
12
+ * "drift": {
13
+ * "command": "npx",
14
+ * "args": ["driftdetect-mcp", "/path/to/your/project"]
15
+ * }
16
+ * }
17
+ * }
18
+ */
19
+ export {};
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Drift MCP Server Entry Point
4
+ *
5
+ * Usage:
6
+ * drift-mcp # Run in current directory
7
+ * drift-mcp /path/to/project # Run for specific project
8
+ *
9
+ * MCP Config (add to mcp.json):
10
+ * {
11
+ * "mcpServers": {
12
+ * "drift": {
13
+ * "command": "npx",
14
+ * "args": ["driftdetect-mcp", "/path/to/your/project"]
15
+ * }
16
+ * }
17
+ * }
18
+ */
19
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
20
+ import { createDriftMCPServer } from '../server.js';
21
+ async function main() {
22
+ const projectRoot = process.argv[2] ?? process.cwd();
23
+ const server = createDriftMCPServer({ projectRoot });
24
+ const transport = new StdioServerTransport();
25
+ await server.connect(transport);
26
+ // Handle graceful shutdown
27
+ process.on('SIGINT', async () => {
28
+ await server.close();
29
+ process.exit(0);
30
+ });
31
+ process.on('SIGTERM', async () => {
32
+ await server.close();
33
+ process.exit(0);
34
+ });
35
+ }
36
+ main().catch((error) => {
37
+ console.error('Failed to start Drift MCP server:', error);
38
+ process.exit(1);
39
+ });
40
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAErD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Example Quality Feedback System
3
+ *
4
+ * Tracks user feedback on pattern examples to improve future suggestions.
5
+ * Feedback is stored per-project and used to boost/penalize pattern locations.
6
+ */
7
+ export interface ExampleFeedback {
8
+ patternId: string;
9
+ patternName: string;
10
+ category: string;
11
+ file: string;
12
+ line: number;
13
+ rating: 'good' | 'bad' | 'irrelevant';
14
+ reason?: string | undefined;
15
+ timestamp: string;
16
+ }
17
+ export interface FeedbackStats {
18
+ totalFeedback: number;
19
+ goodExamples: number;
20
+ badExamples: number;
21
+ irrelevantExamples: number;
22
+ topGoodPatterns: Array<{
23
+ pattern: string;
24
+ count: number;
25
+ }>;
26
+ topBadPatterns: Array<{
27
+ pattern: string;
28
+ count: number;
29
+ }>;
30
+ topBadFiles: Array<{
31
+ file: string;
32
+ count: number;
33
+ }>;
34
+ }
35
+ export interface LocationScore {
36
+ file: string;
37
+ boost: number;
38
+ confidence: number;
39
+ }
40
+ export declare class FeedbackManager {
41
+ private feedbackDir;
42
+ private feedbackFile;
43
+ private scoresFile;
44
+ private feedback;
45
+ private locationScores;
46
+ private initialized;
47
+ constructor(projectRoot: string);
48
+ initialize(): Promise<void>;
49
+ private loadFeedback;
50
+ private loadScores;
51
+ private saveFeedback;
52
+ private saveScores;
53
+ /**
54
+ * Record feedback on an example
55
+ */
56
+ recordFeedback(feedback: Omit<ExampleFeedback, 'timestamp'>): Promise<void>;
57
+ private updateLocationScore;
58
+ /**
59
+ * Get the quality score for a file (used to rank examples)
60
+ * Returns a multiplier: 1.0 = neutral, >1 = boosted, <1 = penalized
61
+ */
62
+ getFileScore(file: string): number;
63
+ /**
64
+ * Check if a file should be excluded based on consistent bad feedback
65
+ */
66
+ shouldExcludeFile(file: string): boolean;
67
+ /**
68
+ * Get feedback statistics
69
+ */
70
+ getStats(): Promise<FeedbackStats>;
71
+ /**
72
+ * Get all feedback for export/analysis
73
+ */
74
+ getAllFeedback(): Promise<ExampleFeedback[]>;
75
+ /**
76
+ * Clear all feedback (for testing or reset)
77
+ */
78
+ clearFeedback(): Promise<void>;
79
+ }
80
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAMD,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAMzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YASnB,YAAY;YASZ,UAAU;YAUV,YAAY;YAIZ,UAAU;IAKxB;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBnE,mBAAmB;IA4BjC;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAqBlC;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQxC;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAqDxC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAKlD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAMrC"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Example Quality Feedback System
3
+ *
4
+ * Tracks user feedback on pattern examples to improve future suggestions.
5
+ * Feedback is stored per-project and used to boost/penalize pattern locations.
6
+ */
7
+ import * as fs from 'node:fs/promises';
8
+ import * as path from 'node:path';
9
+ // ============================================================================
10
+ // Feedback Manager
11
+ // ============================================================================
12
+ export class FeedbackManager {
13
+ feedbackDir;
14
+ feedbackFile;
15
+ scoresFile;
16
+ feedback = [];
17
+ locationScores = new Map();
18
+ initialized = false;
19
+ constructor(projectRoot) {
20
+ this.feedbackDir = path.join(projectRoot, '.drift', 'feedback');
21
+ this.feedbackFile = path.join(this.feedbackDir, 'examples.json');
22
+ this.scoresFile = path.join(this.feedbackDir, 'scores.json');
23
+ }
24
+ async initialize() {
25
+ if (this.initialized)
26
+ return;
27
+ await fs.mkdir(this.feedbackDir, { recursive: true });
28
+ await this.loadFeedback();
29
+ await this.loadScores();
30
+ this.initialized = true;
31
+ }
32
+ async loadFeedback() {
33
+ try {
34
+ const content = await fs.readFile(this.feedbackFile, 'utf-8');
35
+ this.feedback = JSON.parse(content);
36
+ }
37
+ catch {
38
+ this.feedback = [];
39
+ }
40
+ }
41
+ async loadScores() {
42
+ try {
43
+ const content = await fs.readFile(this.scoresFile, 'utf-8');
44
+ const scores = JSON.parse(content);
45
+ this.locationScores = new Map(scores.map(s => [s.file, s]));
46
+ }
47
+ catch {
48
+ this.locationScores = new Map();
49
+ }
50
+ }
51
+ async saveFeedback() {
52
+ await fs.writeFile(this.feedbackFile, JSON.stringify(this.feedback, null, 2), 'utf-8');
53
+ }
54
+ async saveScores() {
55
+ const scores = Array.from(this.locationScores.values());
56
+ await fs.writeFile(this.scoresFile, JSON.stringify(scores, null, 2), 'utf-8');
57
+ }
58
+ /**
59
+ * Record feedback on an example
60
+ */
61
+ async recordFeedback(feedback) {
62
+ await this.initialize();
63
+ const entry = {
64
+ ...feedback,
65
+ timestamp: new Date().toISOString(),
66
+ };
67
+ this.feedback.push(entry);
68
+ // Update location scores
69
+ await this.updateLocationScore(feedback.file, feedback.rating);
70
+ // Keep last 5000 feedback entries
71
+ if (this.feedback.length > 5000) {
72
+ this.feedback = this.feedback.slice(-5000);
73
+ }
74
+ await this.saveFeedback();
75
+ await this.saveScores();
76
+ }
77
+ async updateLocationScore(file, rating) {
78
+ const existing = this.locationScores.get(file) || {
79
+ file,
80
+ boost: 0,
81
+ confidence: 0,
82
+ };
83
+ // Update boost based on rating
84
+ const delta = rating === 'good' ? 0.1 : rating === 'bad' ? -0.15 : -0.05;
85
+ existing.boost = Math.max(-1, Math.min(1, existing.boost + delta));
86
+ // Increase confidence with each feedback
87
+ existing.confidence = Math.min(1, existing.confidence + 0.1);
88
+ this.locationScores.set(file, existing);
89
+ // Also update directory-level scores for pattern propagation
90
+ const dir = path.dirname(file);
91
+ const dirScore = this.locationScores.get(dir) || {
92
+ file: dir,
93
+ boost: 0,
94
+ confidence: 0,
95
+ };
96
+ dirScore.boost = Math.max(-1, Math.min(1, dirScore.boost + delta * 0.3));
97
+ dirScore.confidence = Math.min(1, dirScore.confidence + 0.03);
98
+ this.locationScores.set(dir, dirScore);
99
+ }
100
+ /**
101
+ * Get the quality score for a file (used to rank examples)
102
+ * Returns a multiplier: 1.0 = neutral, >1 = boosted, <1 = penalized
103
+ */
104
+ getFileScore(file) {
105
+ const fileScore = this.locationScores.get(file);
106
+ const dirScore = this.locationScores.get(path.dirname(file));
107
+ let boost = 0;
108
+ let confidence = 0;
109
+ if (fileScore) {
110
+ boost += fileScore.boost * fileScore.confidence;
111
+ confidence = Math.max(confidence, fileScore.confidence);
112
+ }
113
+ if (dirScore) {
114
+ boost += dirScore.boost * dirScore.confidence * 0.5;
115
+ confidence = Math.max(confidence, dirScore.confidence * 0.5);
116
+ }
117
+ // Convert boost to multiplier: -1 -> 0.3, 0 -> 1.0, 1 -> 1.7
118
+ return 1 + (boost * 0.7);
119
+ }
120
+ /**
121
+ * Check if a file should be excluded based on consistent bad feedback
122
+ */
123
+ shouldExcludeFile(file) {
124
+ const score = this.locationScores.get(file);
125
+ if (!score)
126
+ return false;
127
+ // Exclude if we have high confidence that this file produces bad examples
128
+ return score.boost < -0.5 && score.confidence > 0.5;
129
+ }
130
+ /**
131
+ * Get feedback statistics
132
+ */
133
+ async getStats() {
134
+ await this.initialize();
135
+ const goodExamples = this.feedback.filter(f => f.rating === 'good').length;
136
+ const badExamples = this.feedback.filter(f => f.rating === 'bad').length;
137
+ const irrelevantExamples = this.feedback.filter(f => f.rating === 'irrelevant').length;
138
+ // Count patterns
139
+ const patternCounts = new Map();
140
+ for (const f of this.feedback) {
141
+ const key = `${f.category}/${f.patternName}`;
142
+ const counts = patternCounts.get(key) || { good: 0, bad: 0 };
143
+ if (f.rating === 'good')
144
+ counts.good++;
145
+ else if (f.rating === 'bad')
146
+ counts.bad++;
147
+ patternCounts.set(key, counts);
148
+ }
149
+ // Count bad files
150
+ const fileCounts = new Map();
151
+ for (const f of this.feedback) {
152
+ if (f.rating === 'bad' || f.rating === 'irrelevant') {
153
+ fileCounts.set(f.file, (fileCounts.get(f.file) || 0) + 1);
154
+ }
155
+ }
156
+ const topGoodPatterns = Array.from(patternCounts.entries())
157
+ .filter(([, c]) => c.good > 0)
158
+ .sort((a, b) => b[1].good - a[1].good)
159
+ .slice(0, 5)
160
+ .map(([pattern, counts]) => ({ pattern, count: counts.good }));
161
+ const topBadPatterns = Array.from(patternCounts.entries())
162
+ .filter(([, c]) => c.bad > 0)
163
+ .sort((a, b) => b[1].bad - a[1].bad)
164
+ .slice(0, 5)
165
+ .map(([pattern, counts]) => ({ pattern, count: counts.bad }));
166
+ const topBadFiles = Array.from(fileCounts.entries())
167
+ .sort((a, b) => b[1] - a[1])
168
+ .slice(0, 10)
169
+ .map(([file, count]) => ({ file, count }));
170
+ return {
171
+ totalFeedback: this.feedback.length,
172
+ goodExamples,
173
+ badExamples,
174
+ irrelevantExamples,
175
+ topGoodPatterns,
176
+ topBadPatterns,
177
+ topBadFiles,
178
+ };
179
+ }
180
+ /**
181
+ * Get all feedback for export/analysis
182
+ */
183
+ async getAllFeedback() {
184
+ await this.initialize();
185
+ return [...this.feedback];
186
+ }
187
+ /**
188
+ * Clear all feedback (for testing or reset)
189
+ */
190
+ async clearFeedback() {
191
+ this.feedback = [];
192
+ this.locationScores = new Map();
193
+ await this.saveFeedback();
194
+ await this.saveScores();
195
+ }
196
+ }
197
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAiClC,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,UAAU,CAAS;IACnB,QAAQ,GAAsB,EAAE,CAAC;IACjC,cAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;IACvD,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAA4C;QAC/D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,MAAM,KAAK,GAAoB;YAC7B,GAAG,QAAQ;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,yBAAyB;QACzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/D,kCAAkC;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,MAAqC;QACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI;YAChD,IAAI;YACJ,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,+BAA+B;QAC/B,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;QAEnE,yCAAyC;QACzC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QAE7D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAExC,6DAA6D;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YAC/C,IAAI,EAAE,GAAG;YACT,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,CAAC;SACd,CAAC;QACF,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC;QACzE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,IAAY;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAE7D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,IAAI,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC;YAChD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC;YACpD,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QAC/D,CAAC;QAED,6DAA6D;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,IAAY;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,0EAA0E;QAC1E,OAAO,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;QACzE,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,MAAM,CAAC;QAEvF,iBAAiB;QACjB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;gBAAE,MAAM,CAAC,IAAI,EAAE,CAAC;iBAClC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK;gBAAE,MAAM,CAAC,GAAG,EAAE,CAAC;YAC1C,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,kBAAkB;QAClB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBACpD,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;aACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;aAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;aACrC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEjE,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;aACvD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;aAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;aACnC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAEhE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;aACjD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;aACZ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7C,OAAO;YACL,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YACnC,YAAY;YACZ,WAAW;YACX,kBAAkB;YAClB,eAAe;YACf,cAAc;YACd,WAAW;SACZ,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Drift MCP Server
3
+ *
4
+ * Exposes drift functionality as MCP tools for AI agents.
5
+ * This enables structured, type-safe access to codebase patterns.
6
+ */
7
+ export { createDriftMCPServer } from './server.js';
8
+ export type { DriftMCPConfig } from './server.js';
9
+ export { PackManager, DEFAULT_PACKS } from './packs.js';
10
+ export type { PackDefinition, PackMeta, PackResult, PackUsage, SuggestedPack, } from './packs.js';
11
+ export { FeedbackManager } from './feedback.js';
12
+ export type { ExampleFeedback, FeedbackStats, LocationScore, } from './feedback.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACV,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EACV,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Drift MCP Server
3
+ *
4
+ * Exposes drift functionality as MCP tools for AI agents.
5
+ * This enables structured, type-safe access to codebase patterns.
6
+ */
7
+ export { createDriftMCPServer } from './server.js';
8
+ export { PackManager, DEFAULT_PACKS } from './packs.js';
9
+ export { FeedbackManager } from './feedback.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AASxD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Pattern Packs - Pre-defined bundles of patterns for common tasks
3
+ *
4
+ * Provides cached, task-oriented pattern context for AI agents.
5
+ */
6
+ import { PatternStore } from 'driftdetect-core';
7
+ export interface PackDefinition {
8
+ name: string;
9
+ description: string;
10
+ categories: string[];
11
+ patterns?: string[] | undefined;
12
+ maxExamples?: number;
13
+ contextLines?: number;
14
+ minConfidence?: number;
15
+ includeDeprecated?: boolean;
16
+ }
17
+ export interface PackMeta {
18
+ name: string;
19
+ generatedAt: string;
20
+ patternHash: string;
21
+ sourceFiles: string[];
22
+ packDefHash: string;
23
+ }
24
+ export interface PackResult {
25
+ content: string;
26
+ fromCache: boolean;
27
+ generatedAt: string;
28
+ staleReason?: string;
29
+ }
30
+ export interface PackUsage {
31
+ categories: string[];
32
+ patterns?: string[] | undefined;
33
+ timestamp: string;
34
+ context?: 'code_generation' | 'review' | 'onboarding' | 'unknown';
35
+ }
36
+ export interface SuggestedPack {
37
+ name: string;
38
+ description: string;
39
+ categories: string[];
40
+ patterns?: string[] | undefined;
41
+ usageCount: number;
42
+ lastUsed: string;
43
+ }
44
+ export declare const DEFAULT_PACKS: PackDefinition[];
45
+ export declare class PackManager {
46
+ private projectRoot;
47
+ private store;
48
+ private packsDir;
49
+ private cacheDir;
50
+ private customPacks;
51
+ constructor(projectRoot: string, store: PatternStore);
52
+ initialize(): Promise<void>;
53
+ private ensureDirectories;
54
+ private loadCustomPacks;
55
+ getAllPacks(): PackDefinition[];
56
+ getPack(name: string): PackDefinition | undefined;
57
+ getPackContent(name: string, options?: {
58
+ refresh?: boolean;
59
+ }): Promise<PackResult>;
60
+ private checkStaleness;
61
+ private generatePack;
62
+ private hashPackDef;
63
+ private computePatternHash;
64
+ refreshAllPacks(): Promise<Map<string, PackResult>>;
65
+ /**
66
+ * Track pack/category usage for learning
67
+ */
68
+ trackUsage(usage: PackUsage): Promise<void>;
69
+ /**
70
+ * Suggest packs based on usage patterns
71
+ */
72
+ suggestPacks(): Promise<SuggestedPack[]>;
73
+ /**
74
+ * Create a custom pack from suggestion or manual definition
75
+ */
76
+ createCustomPack(pack: PackDefinition): Promise<void>;
77
+ /**
78
+ * Delete a custom pack
79
+ */
80
+ deleteCustomPack(name: string): Promise<boolean>;
81
+ /**
82
+ * Infer packs from codebase structure (co-occurring patterns)
83
+ */
84
+ inferPacksFromStructure(): Promise<SuggestedPack[]>;
85
+ }
86
+ //# sourceMappingURL=packs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.d.ts","sourceRoot":"","sources":["../src/packs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAA+B,MAAM,kBAAkB,CAAC;AA8G7E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;CACnE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,eAAO,MAAM,aAAa,EAAE,cAAc,EAwCzC,CAAC;AAMF,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAwB;gBAE/B,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY;IAO9C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAMnB,iBAAiB;YAKjB,eAAe;IAW7B,WAAW,IAAI,cAAc,EAAE;IAY/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,CAAC;YA0C9E,cAAc;YA0Cd,YAAY;IAgL1B,OAAO,CAAC,WAAW;YAUL,kBAAkB;IAU1B,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAazD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBjD;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA4E9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B3D;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgCtD;;OAEG;IACG,uBAAuB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;CA+D1D"}