driftdetect-lsp 0.9.32 → 0.9.34
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/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +183 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/show-patterns.d.ts +30 -0
- package/dist/commands/show-patterns.d.ts.map +1 -1
- package/dist/commands/show-patterns.js +175 -0
- package/dist/commands/show-patterns.js.map +1 -0
- package/dist/handlers/code-actions.d.ts +32 -0
- package/dist/handlers/code-actions.d.ts.map +1 -1
- package/dist/handlers/code-actions.js +184 -0
- package/dist/handlers/code-actions.js.map +1 -0
- package/dist/handlers/code-lens.d.ts +32 -0
- package/dist/handlers/code-lens.d.ts.map +1 -1
- package/dist/handlers/code-lens.js +162 -0
- package/dist/handlers/code-lens.js.map +1 -0
- package/dist/handlers/commands.d.ts +48 -0
- package/dist/handlers/commands.d.ts.map +1 -1
- package/dist/handlers/commands.js +360 -0
- package/dist/handlers/commands.js.map +1 -0
- package/dist/handlers/diagnostics.d.ts +73 -0
- package/dist/handlers/diagnostics.d.ts.map +1 -1
- package/dist/handlers/diagnostics.js +259 -0
- package/dist/handlers/diagnostics.js.map +1 -0
- package/dist/handlers/document-sync.d.ts +37 -0
- package/dist/handlers/document-sync.d.ts.map +1 -1
- package/dist/handlers/document-sync.js +49 -0
- package/dist/handlers/document-sync.js.map +1 -0
- package/dist/handlers/hover.d.ts +30 -0
- package/dist/handlers/hover.d.ts.map +1 -1
- package/dist/handlers/hover.js +119 -0
- package/dist/handlers/hover.js.map +1 -0
- package/dist/integration/core-scanner.d.ts.map +1 -1
- package/dist/integration/core-scanner.js +309 -0
- package/dist/integration/core-scanner.js.map +1 -0
- package/dist/integration/pattern-store-adapter.d.ts +117 -0
- package/dist/integration/pattern-store-adapter.d.ts.map +1 -1
- package/dist/integration/pattern-store-adapter.js +349 -0
- package/dist/integration/pattern-store-adapter.js.map +1 -0
- package/dist/integration/types.d.ts +134 -0
- package/dist/integration/types.d.ts.map +1 -1
- package/dist/integration/types.js +39 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/server/types.d.ts +139 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +8 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +208 -0
- package/dist/server.js.map +1 -0
- package/dist/utils/diagnostic.js +263 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/document.d.ts +40 -0
- package/dist/utils/document.d.ts.map +1 -0
- package/dist/utils/document.js +138 -0
- package/dist/utils/document.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/workspace.d.ts.map +1 -1
- package/dist/utils/workspace.js +241 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +13 -13
- package/LICENSE +0 -121
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Lens Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides code lens (inline actions) for pattern information.
|
|
5
|
+
* Shows violation counts, pattern names, and quick actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.6 - THE LSP_Server SHALL provide code lens for pattern information
|
|
8
|
+
*/
|
|
9
|
+
import type { DiagnosticsHandler } from './diagnostics.js';
|
|
10
|
+
import type { Connection, TextDocuments, CodeLens, CodeLensParams } from 'vscode-languageserver';
|
|
11
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
12
|
+
interface Logger {
|
|
13
|
+
error(message: string): void;
|
|
14
|
+
warn(message: string): void;
|
|
15
|
+
info(message: string): void;
|
|
16
|
+
debug(message: string): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Code lens handler interface
|
|
20
|
+
*/
|
|
21
|
+
export interface CodeLensHandler {
|
|
22
|
+
/** Handle code lens request */
|
|
23
|
+
onCodeLens(params: CodeLensParams): CodeLens[] | null;
|
|
24
|
+
/** Handle code lens resolve request */
|
|
25
|
+
onCodeLensResolve(codeLens: CodeLens): CodeLens;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create the code lens handler
|
|
29
|
+
*/
|
|
30
|
+
export declare function createCodeLensHandler(_connection: Connection, _documents: TextDocuments<TextDocument>, diagnosticsHandler: DiagnosticsHandler, logger: Logger): CodeLensHandler;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=code-lens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-lens.d.ts","sourceRoot":"","sources":["../../src/handlers/code-lens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"code-lens.d.ts","sourceRoot":"","sources":["../../src/handlers/code-lens.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvE,UAAU,MAAM;IACd,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IACtD,uCAAuC;IACvC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACjD;AA+ED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,EACvC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,eAAe,CAoHjB"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Lens Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides code lens (inline actions) for pattern information.
|
|
5
|
+
* Shows violation counts, pattern names, and quick actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.6 - THE LSP_Server SHALL provide code lens for pattern information
|
|
8
|
+
*/
|
|
9
|
+
import { DRIFT_COMMANDS } from '../capabilities.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Helpers
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Group diagnostics by pattern ID
|
|
15
|
+
*/
|
|
16
|
+
function groupByPattern(diagnostics) {
|
|
17
|
+
const groups = new Map();
|
|
18
|
+
for (const diagnostic of diagnostics) {
|
|
19
|
+
const patternId = diagnostic.data?.patternId ?? 'unknown';
|
|
20
|
+
const group = groups.get(patternId) ?? [];
|
|
21
|
+
group.push(diagnostic);
|
|
22
|
+
groups.set(patternId, group);
|
|
23
|
+
}
|
|
24
|
+
return groups;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Count diagnostics by severity
|
|
28
|
+
*/
|
|
29
|
+
function countBySeverity(diagnostics) {
|
|
30
|
+
let errors = 0;
|
|
31
|
+
let warnings = 0;
|
|
32
|
+
let info = 0;
|
|
33
|
+
let hints = 0;
|
|
34
|
+
for (const d of diagnostics) {
|
|
35
|
+
switch (d.severity) {
|
|
36
|
+
case 1:
|
|
37
|
+
errors++;
|
|
38
|
+
break;
|
|
39
|
+
case 2:
|
|
40
|
+
warnings++;
|
|
41
|
+
break;
|
|
42
|
+
case 3:
|
|
43
|
+
info++;
|
|
44
|
+
break;
|
|
45
|
+
case 4:
|
|
46
|
+
hints++;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { errors, warnings, info, hints };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Format violation count for display
|
|
54
|
+
*/
|
|
55
|
+
function formatViolationCount(count) {
|
|
56
|
+
return count === 1 ? '1 violation' : `${count} violations`;
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Handler Factory
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* Create the code lens handler
|
|
63
|
+
*/
|
|
64
|
+
export function createCodeLensHandler(_connection, _documents, diagnosticsHandler, logger) {
|
|
65
|
+
return {
|
|
66
|
+
onCodeLens(params) {
|
|
67
|
+
const uri = params.textDocument.uri;
|
|
68
|
+
logger.debug(`Code lens request for ${uri}`);
|
|
69
|
+
// Get diagnostics for this document
|
|
70
|
+
const diagnostics = diagnosticsHandler.getDiagnostics(uri);
|
|
71
|
+
if (diagnostics.length === 0) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
const codeLenses = [];
|
|
75
|
+
// Document summary code lens at the top
|
|
76
|
+
const counts = countBySeverity(diagnostics);
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (counts.errors > 0) {
|
|
79
|
+
parts.push(`${counts.errors} error${counts.errors === 1 ? '' : 's'}`);
|
|
80
|
+
}
|
|
81
|
+
if (counts.warnings > 0) {
|
|
82
|
+
parts.push(`${counts.warnings} warning${counts.warnings === 1 ? '' : 's'}`);
|
|
83
|
+
}
|
|
84
|
+
const summaryTitle = `📊 Drift: ${formatViolationCount(diagnostics.length)}${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`;
|
|
85
|
+
codeLenses.push({
|
|
86
|
+
range: {
|
|
87
|
+
start: { line: 0, character: 0 },
|
|
88
|
+
end: { line: 0, character: 0 },
|
|
89
|
+
},
|
|
90
|
+
command: {
|
|
91
|
+
title: summaryTitle,
|
|
92
|
+
command: DRIFT_COMMANDS.SHOW_VIOLATIONS,
|
|
93
|
+
arguments: [uri],
|
|
94
|
+
},
|
|
95
|
+
data: {
|
|
96
|
+
type: 'summary',
|
|
97
|
+
uri,
|
|
98
|
+
violationCount: diagnostics.length,
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
// Group diagnostics by pattern
|
|
102
|
+
const patternGroups = groupByPattern(diagnostics);
|
|
103
|
+
// Create code lens for each pattern group
|
|
104
|
+
for (const [patternId, patternDiagnostics] of patternGroups) {
|
|
105
|
+
if (patternDiagnostics.length === 0) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const firstDiagnostic = patternDiagnostics[0];
|
|
109
|
+
if (!firstDiagnostic) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const count = patternDiagnostics.length;
|
|
113
|
+
// Pattern summary at first occurrence
|
|
114
|
+
codeLenses.push({
|
|
115
|
+
range: firstDiagnostic.range,
|
|
116
|
+
command: {
|
|
117
|
+
title: `⚠️ ${formatViolationCount(count)}: ${patternId}`,
|
|
118
|
+
command: DRIFT_COMMANDS.SHOW_VIOLATIONS,
|
|
119
|
+
arguments: [uri, patternId],
|
|
120
|
+
},
|
|
121
|
+
data: {
|
|
122
|
+
type: 'pattern',
|
|
123
|
+
uri,
|
|
124
|
+
patternId,
|
|
125
|
+
violationCount: count,
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
// Individual violation code lenses (limit to avoid clutter)
|
|
129
|
+
if (count <= 5) {
|
|
130
|
+
for (let i = 1; i < patternDiagnostics.length; i++) {
|
|
131
|
+
const diagnostic = patternDiagnostics[i];
|
|
132
|
+
if (!diagnostic) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
codeLenses.push({
|
|
136
|
+
range: diagnostic.range,
|
|
137
|
+
command: {
|
|
138
|
+
title: `💡 ${diagnostic.message}`,
|
|
139
|
+
command: DRIFT_COMMANDS.SHOW_VIOLATIONS,
|
|
140
|
+
arguments: [uri, patternId, diagnostic.data?.violationId],
|
|
141
|
+
},
|
|
142
|
+
data: {
|
|
143
|
+
type: 'violation',
|
|
144
|
+
uri,
|
|
145
|
+
patternId,
|
|
146
|
+
},
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
logger.debug(`Generated ${codeLenses.length} code lenses`);
|
|
152
|
+
return codeLenses;
|
|
153
|
+
},
|
|
154
|
+
onCodeLensResolve(codeLens) {
|
|
155
|
+
logger.debug('Resolving code lens');
|
|
156
|
+
// Code lenses are already resolved with commands
|
|
157
|
+
// This handler is for deferred resolution if needed
|
|
158
|
+
return codeLens;
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=code-lens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-lens.js","sourceRoot":"","sources":["../../src/handlers/code-lens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commands Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles execution of Drift LSP commands.
|
|
5
|
+
* Routes commands to appropriate handlers and returns results.
|
|
6
|
+
* Integrates with driftdetect-core pattern store for persistence.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 28.1 - drift.approvePattern
|
|
9
|
+
* @requirements 28.2 - drift.ignorePattern
|
|
10
|
+
* @requirements 28.3 - drift.ignoreOnce
|
|
11
|
+
* @requirements 28.4 - drift.createVariant
|
|
12
|
+
* @requirements 28.5 - drift.explainWithAI
|
|
13
|
+
* @requirements 28.6 - drift.fixWithAI
|
|
14
|
+
* @requirements 28.7 - drift.rescan
|
|
15
|
+
* @requirements 28.8 - drift.showPatterns
|
|
16
|
+
* @requirements 28.9 - drift.showViolations
|
|
17
|
+
*/
|
|
18
|
+
import type { DiagnosticsHandler } from './diagnostics.js';
|
|
19
|
+
import type { Connection, TextDocuments, ExecuteCommandParams } from 'vscode-languageserver';
|
|
20
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
21
|
+
interface Logger {
|
|
22
|
+
error(message: string): void;
|
|
23
|
+
warn(message: string): void;
|
|
24
|
+
info(message: string): void;
|
|
25
|
+
debug(message: string): void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Command execution result
|
|
29
|
+
*/
|
|
30
|
+
export interface CommandResult {
|
|
31
|
+
success: boolean;
|
|
32
|
+
message?: string;
|
|
33
|
+
data?: unknown;
|
|
34
|
+
error?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Commands handler interface
|
|
38
|
+
*/
|
|
39
|
+
export interface CommandsHandler {
|
|
40
|
+
/** Handle execute command request */
|
|
41
|
+
onExecuteCommand(params: ExecuteCommandParams): Promise<CommandResult>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create the commands handler
|
|
45
|
+
*/
|
|
46
|
+
export declare function createCommandsHandler(connection: Connection, documents: TextDocuments<TextDocument>, diagnosticsHandler: DiagnosticsHandler, logger: Logger): CommandsHandler;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/handlers/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/handlers/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvE,UAAU,MAAM;IACd,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxE;AA8bD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,EACtC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,eAAe,CA0GjB"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Commands Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles execution of Drift LSP commands.
|
|
5
|
+
* Routes commands to appropriate handlers and returns results.
|
|
6
|
+
* Integrates with driftdetect-core pattern store for persistence.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 28.1 - drift.approvePattern
|
|
9
|
+
* @requirements 28.2 - drift.ignorePattern
|
|
10
|
+
* @requirements 28.3 - drift.ignoreOnce
|
|
11
|
+
* @requirements 28.4 - drift.createVariant
|
|
12
|
+
* @requirements 28.5 - drift.explainWithAI
|
|
13
|
+
* @requirements 28.6 - drift.fixWithAI
|
|
14
|
+
* @requirements 28.7 - drift.rescan
|
|
15
|
+
* @requirements 28.8 - drift.showPatterns
|
|
16
|
+
* @requirements 28.9 - drift.showViolations
|
|
17
|
+
*/
|
|
18
|
+
import { DRIFT_COMMANDS } from '../capabilities.js';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Command Implementations
|
|
21
|
+
// ============================================================================
|
|
22
|
+
/**
|
|
23
|
+
* Approve a pattern
|
|
24
|
+
* @requirements 28.1 - drift.approvePattern
|
|
25
|
+
*/
|
|
26
|
+
async function executeApprovePattern(connection, diagnosticsHandler, logger, patternId) {
|
|
27
|
+
logger.info(`Approving pattern: ${patternId}`);
|
|
28
|
+
// Get the pattern store adapter from diagnostics handler
|
|
29
|
+
const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
|
|
30
|
+
if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
|
|
31
|
+
// Use the pattern store adapter to persist the approval
|
|
32
|
+
const result = await patternStoreAdapter.approve(patternId);
|
|
33
|
+
if (result.success) {
|
|
34
|
+
// Clear diagnostics for all documents to remove violations for this pattern
|
|
35
|
+
diagnosticsHandler.clearAllDiagnostics();
|
|
36
|
+
connection.window.showInformationMessage(`Pattern "${patternId}" approved. ${result.removedViolations} violation(s) will be cleared.`);
|
|
37
|
+
return {
|
|
38
|
+
success: true,
|
|
39
|
+
message: `Pattern "${patternId}" approved`,
|
|
40
|
+
data: { patternId, removedViolations: result.removedViolations },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
connection.window.showErrorMessage(`Failed to approve pattern: ${result.error ?? 'Unknown error'}`);
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
error: result.error ?? 'Unknown error',
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Fallback if pattern store adapter not available
|
|
52
|
+
connection.window.showInformationMessage(`Pattern "${patternId}" approved. Violations will be cleared.`);
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
message: `Pattern "${patternId}" approved`,
|
|
56
|
+
data: { patternId },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Ignore a pattern
|
|
61
|
+
* @requirements 28.2 - drift.ignorePattern
|
|
62
|
+
*/
|
|
63
|
+
async function executeIgnorePattern(connection, diagnosticsHandler, logger, patternId) {
|
|
64
|
+
logger.info(`Ignoring pattern: ${patternId}`);
|
|
65
|
+
// Get the pattern store adapter from diagnostics handler
|
|
66
|
+
const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
|
|
67
|
+
if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
|
|
68
|
+
// Use the pattern store adapter to persist the ignore
|
|
69
|
+
const result = await patternStoreAdapter.ignore(patternId);
|
|
70
|
+
if (result.success) {
|
|
71
|
+
// Clear diagnostics for all documents to remove violations for this pattern
|
|
72
|
+
diagnosticsHandler.clearAllDiagnostics();
|
|
73
|
+
connection.window.showInformationMessage(`Pattern "${patternId}" ignored. ${result.suppressedViolations} violation(s) will be suppressed.`);
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
message: `Pattern "${patternId}" ignored`,
|
|
77
|
+
data: { patternId, suppressedViolations: result.suppressedViolations },
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
connection.window.showErrorMessage(`Failed to ignore pattern: ${result.error ?? 'Unknown error'}`);
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: result.error ?? 'Unknown error',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Fallback if pattern store adapter not available
|
|
89
|
+
connection.window.showInformationMessage(`Pattern "${patternId}" ignored. Violations will be suppressed.`);
|
|
90
|
+
return {
|
|
91
|
+
success: true,
|
|
92
|
+
message: `Pattern "${patternId}" ignored`,
|
|
93
|
+
data: { patternId },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Ignore a single occurrence
|
|
98
|
+
* @requirements 28.3 - drift.ignoreOnce
|
|
99
|
+
*/
|
|
100
|
+
async function executeIgnoreOnce(connection, logger, violationId, uri, line) {
|
|
101
|
+
logger.info(`Ignoring violation once: ${violationId} at ${uri}:${line}`);
|
|
102
|
+
// TODO: Add ignore comment to the file
|
|
103
|
+
// - Insert // drift-ignore-next-line or similar
|
|
104
|
+
// - Re-scan the document
|
|
105
|
+
connection.window.showInformationMessage(`Violation ignored for this occurrence.`);
|
|
106
|
+
return {
|
|
107
|
+
success: true,
|
|
108
|
+
message: 'Violation ignored',
|
|
109
|
+
data: { violationId, uri, line },
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a variant
|
|
114
|
+
* @requirements 28.4 - drift.createVariant
|
|
115
|
+
*/
|
|
116
|
+
async function executeCreateVariant(connection, diagnosticsHandler, logger, patternId, violationId, file, line, column) {
|
|
117
|
+
logger.info(`Creating variant for pattern: ${patternId}`);
|
|
118
|
+
// Get the pattern store adapter from diagnostics handler
|
|
119
|
+
const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
|
|
120
|
+
if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
|
|
121
|
+
// Generate a variant name
|
|
122
|
+
const variantName = `variant-${Date.now().toString(36)}`;
|
|
123
|
+
// Build the variant input, conditionally including scopeValue
|
|
124
|
+
const variantInput = {
|
|
125
|
+
patternId,
|
|
126
|
+
name: variantName,
|
|
127
|
+
reason: 'Intentional deviation from pattern',
|
|
128
|
+
scope: file ? 'file' : 'global',
|
|
129
|
+
file: file || '',
|
|
130
|
+
line: line || 1,
|
|
131
|
+
column: column || 1,
|
|
132
|
+
};
|
|
133
|
+
// Only add scopeValue if file is provided
|
|
134
|
+
if (file) {
|
|
135
|
+
variantInput.scopeValue = file;
|
|
136
|
+
}
|
|
137
|
+
// Create the variant
|
|
138
|
+
const result = await patternStoreAdapter.createVariant(variantInput);
|
|
139
|
+
if (result.success) {
|
|
140
|
+
connection.window.showInformationMessage(`Variant "${variantName}" created for pattern "${patternId}". Configure it in .drift/patterns/variants/`);
|
|
141
|
+
return {
|
|
142
|
+
success: true,
|
|
143
|
+
message: `Variant "${variantName}" created`,
|
|
144
|
+
data: { patternId, variantName, variantId: result.variantId, violationId },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
connection.window.showErrorMessage(`Failed to create variant: ${result.error ?? 'Unknown error'}`);
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
error: result.error ?? 'Unknown error',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Fallback if pattern store adapter not available
|
|
156
|
+
const variantName = `variant-${Date.now()}`;
|
|
157
|
+
connection.window.showInformationMessage(`Variant "${variantName}" created for pattern "${patternId}". Configure it in .drift/patterns/variants/`);
|
|
158
|
+
return {
|
|
159
|
+
success: true,
|
|
160
|
+
message: `Variant "${variantName}" created`,
|
|
161
|
+
data: { patternId, variantName, violationId },
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Explain with AI
|
|
166
|
+
* @requirements 28.5 - drift.explainWithAI
|
|
167
|
+
*/
|
|
168
|
+
async function executeExplainAI(connection, logger, violationId, patternId) {
|
|
169
|
+
logger.info(`AI explain requested for violation: ${violationId}`);
|
|
170
|
+
// TODO: Integrate with @drift/ai
|
|
171
|
+
// - Build context from violation and pattern
|
|
172
|
+
// - Send to AI provider
|
|
173
|
+
// - Display explanation to user
|
|
174
|
+
connection.window.showInformationMessage('AI explanation feature requires @drift/ai integration. Coming soon!');
|
|
175
|
+
return {
|
|
176
|
+
success: true,
|
|
177
|
+
message: 'AI explain requested',
|
|
178
|
+
data: { violationId, patternId },
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Fix with AI
|
|
183
|
+
* @requirements 28.6 - drift.fixWithAI
|
|
184
|
+
*/
|
|
185
|
+
async function executeFixAI(connection, logger, violationId, uri) {
|
|
186
|
+
logger.info(`AI fix requested for violation: ${violationId}`);
|
|
187
|
+
// TODO: Integrate with @drift/ai
|
|
188
|
+
// - Build context from violation
|
|
189
|
+
// - Generate fix with AI
|
|
190
|
+
// - Show diff preview
|
|
191
|
+
// - Apply fix if confirmed
|
|
192
|
+
connection.window.showInformationMessage('AI fix feature requires @drift/ai integration. Coming soon!');
|
|
193
|
+
return {
|
|
194
|
+
success: true,
|
|
195
|
+
message: 'AI fix requested',
|
|
196
|
+
data: { violationId, uri },
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Rescan workspace
|
|
201
|
+
* @requirements 28.7 - drift.rescan
|
|
202
|
+
*/
|
|
203
|
+
async function executeRescan(connection, documents, diagnosticsHandler, logger, uri) {
|
|
204
|
+
logger.info(`Rescan requested${uri ? ` for: ${uri}` : ' for all documents'}`);
|
|
205
|
+
// Get documents to scan
|
|
206
|
+
const documentsToScan = uri
|
|
207
|
+
? [documents.get(uri)].filter((d) => d !== undefined)
|
|
208
|
+
: documents.all();
|
|
209
|
+
if (documentsToScan.length === 0) {
|
|
210
|
+
return {
|
|
211
|
+
success: true,
|
|
212
|
+
message: 'No documents to scan',
|
|
213
|
+
data: { scannedCount: 0 },
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// Note: withProgress is not available in vscode-languageserver
|
|
217
|
+
// Show a simple message instead
|
|
218
|
+
connection.window.showInformationMessage(`Rescanning ${documentsToScan.length} document(s)...`);
|
|
219
|
+
for (const doc of documentsToScan) {
|
|
220
|
+
await diagnosticsHandler.publishDiagnostics(doc.uri);
|
|
221
|
+
}
|
|
222
|
+
connection.window.showInformationMessage(`Rescan complete: ${documentsToScan.length} document(s) scanned.`);
|
|
223
|
+
return {
|
|
224
|
+
success: true,
|
|
225
|
+
message: 'Rescan complete',
|
|
226
|
+
data: { scannedCount: documentsToScan.length },
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Show patterns
|
|
231
|
+
* @requirements 28.8 - drift.showPatterns
|
|
232
|
+
*/
|
|
233
|
+
async function executeShowPatterns(connection, diagnosticsHandler, logger, patternId) {
|
|
234
|
+
logger.info(`Show patterns requested${patternId ? `: ${patternId}` : ''}`);
|
|
235
|
+
// Get the pattern store adapter from diagnostics handler
|
|
236
|
+
const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
|
|
237
|
+
if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
|
|
238
|
+
if (patternId) {
|
|
239
|
+
// Get specific pattern
|
|
240
|
+
const pattern = patternStoreAdapter.getPattern(patternId);
|
|
241
|
+
if (pattern) {
|
|
242
|
+
connection.window.showInformationMessage(`Pattern "${pattern.name}": ${pattern.description || 'No description'} (confidence: ${(pattern.confidence ?? 0) * 100}%)`);
|
|
243
|
+
return {
|
|
244
|
+
success: true,
|
|
245
|
+
message: 'Pattern found',
|
|
246
|
+
data: { pattern },
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
connection.window.showWarningMessage(`Pattern not found: ${patternId}`);
|
|
251
|
+
return {
|
|
252
|
+
success: false,
|
|
253
|
+
error: `Pattern not found: ${patternId}`,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Get all patterns
|
|
259
|
+
const approved = patternStoreAdapter.getApprovedPatterns();
|
|
260
|
+
const discovered = patternStoreAdapter.getDiscoveredPatterns();
|
|
261
|
+
const ignored = patternStoreAdapter.getIgnoredPatterns();
|
|
262
|
+
connection.window.showInformationMessage(`Patterns: ${approved.length} approved, ${discovered.length} discovered, ${ignored.length} ignored`);
|
|
263
|
+
return {
|
|
264
|
+
success: true,
|
|
265
|
+
message: 'Patterns retrieved',
|
|
266
|
+
data: {
|
|
267
|
+
approved: approved.length,
|
|
268
|
+
discovered: discovered.length,
|
|
269
|
+
ignored: ignored.length,
|
|
270
|
+
patterns: [...approved, ...discovered],
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Fallback if pattern store adapter not available
|
|
276
|
+
connection.window.showInformationMessage('Pattern viewer coming soon! Patterns are stored in .drift/patterns/');
|
|
277
|
+
return {
|
|
278
|
+
success: true,
|
|
279
|
+
message: 'Show patterns',
|
|
280
|
+
data: { patternId },
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Show violations
|
|
285
|
+
* @requirements 28.9 - drift.showViolations
|
|
286
|
+
*/
|
|
287
|
+
async function executeShowViolations(connection, diagnosticsHandler, logger, uri, patternId, violationId) {
|
|
288
|
+
logger.info(`Show violations requested${uri ? ` for: ${uri}` : ''}${patternId ? ` pattern: ${patternId}` : ''}`);
|
|
289
|
+
// Get violations
|
|
290
|
+
if (uri) {
|
|
291
|
+
const diagnostics = diagnosticsHandler.getDiagnostics(uri);
|
|
292
|
+
const filtered = patternId
|
|
293
|
+
? diagnostics.filter((d) => d.data?.patternId === patternId)
|
|
294
|
+
: diagnostics;
|
|
295
|
+
connection.window.showInformationMessage(`Found ${filtered.length} violation(s) in this file.`);
|
|
296
|
+
return {
|
|
297
|
+
success: true,
|
|
298
|
+
message: `${filtered.length} violations`,
|
|
299
|
+
data: { uri, patternId, count: filtered.length },
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
// TODO: Show all violations across workspace
|
|
303
|
+
connection.window.showInformationMessage('Violation viewer coming soon!');
|
|
304
|
+
return {
|
|
305
|
+
success: true,
|
|
306
|
+
message: 'Show violations',
|
|
307
|
+
data: { patternId, violationId },
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
// ============================================================================
|
|
311
|
+
// Handler Factory
|
|
312
|
+
// ============================================================================
|
|
313
|
+
/**
|
|
314
|
+
* Create the commands handler
|
|
315
|
+
*/
|
|
316
|
+
export function createCommandsHandler(connection, documents, diagnosticsHandler, logger) {
|
|
317
|
+
return {
|
|
318
|
+
async onExecuteCommand(params) {
|
|
319
|
+
const { command, arguments: args = [] } = params;
|
|
320
|
+
logger.debug(`Executing command: ${command}`);
|
|
321
|
+
try {
|
|
322
|
+
switch (command) {
|
|
323
|
+
case DRIFT_COMMANDS.APPROVE_PATTERN:
|
|
324
|
+
return await executeApprovePattern(connection, diagnosticsHandler, logger, args[0]);
|
|
325
|
+
case DRIFT_COMMANDS.IGNORE_PATTERN:
|
|
326
|
+
return await executeIgnorePattern(connection, diagnosticsHandler, logger, args[0]);
|
|
327
|
+
case DRIFT_COMMANDS.IGNORE_ONCE:
|
|
328
|
+
return await executeIgnoreOnce(connection, logger, args[0], args[1], args[2]);
|
|
329
|
+
case DRIFT_COMMANDS.CREATE_VARIANT:
|
|
330
|
+
return await executeCreateVariant(connection, diagnosticsHandler, logger, args[0], args[1], args[2], args[3], args[4]);
|
|
331
|
+
case DRIFT_COMMANDS.EXPLAIN_AI:
|
|
332
|
+
return await executeExplainAI(connection, logger, args[0], args[1]);
|
|
333
|
+
case DRIFT_COMMANDS.FIX_AI:
|
|
334
|
+
return await executeFixAI(connection, logger, args[0], args[1]);
|
|
335
|
+
case DRIFT_COMMANDS.RESCAN:
|
|
336
|
+
return await executeRescan(connection, documents, diagnosticsHandler, logger, args[0]);
|
|
337
|
+
case DRIFT_COMMANDS.SHOW_PATTERNS:
|
|
338
|
+
return await executeShowPatterns(connection, diagnosticsHandler, logger, args[0]);
|
|
339
|
+
case DRIFT_COMMANDS.SHOW_VIOLATIONS:
|
|
340
|
+
return await executeShowViolations(connection, diagnosticsHandler, logger, args[0], args[1], args[2]);
|
|
341
|
+
default:
|
|
342
|
+
logger.warn(`Unknown command: ${command}`);
|
|
343
|
+
return {
|
|
344
|
+
success: false,
|
|
345
|
+
error: `Unknown command: ${command}`,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
351
|
+
logger.error(`Command ${command} failed: ${errorMessage}`);
|
|
352
|
+
return {
|
|
353
|
+
success: false,
|
|
354
|
+
error: errorMessage,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/handlers/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAuCpD,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAClC,UAAsB,EACtB,kBAAsC,EACtC,MAAc,EACd,SAAiB;IAEjB,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;IAE/C,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;IAExE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC/D,wDAAwD;QACxD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE5D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,4EAA4E;YAC5E,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;YAEzC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,SAAS,eAAe,MAAM,CAAC,iBAAiB,gCAAgC,CAC7F,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,YAAY,SAAS,YAAY;gBAC1C,IAAI,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE;aACjE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAChC,8BAA8B,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAChE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,SAAS,yCAAyC,CAC/D,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,SAAS,YAAY;QAC1C,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,UAAsB,EACtB,kBAAsC,EACtC,MAAc,EACd,SAAiB;IAEjB,MAAM,CAAC,IAAI,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IAE9C,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;IAExE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC/D,sDAAsD;QACtD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE3D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,4EAA4E;YAC5E,kBAAkB,CAAC,mBAAmB,EAAE,CAAC;YAEzC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,SAAS,cAAc,MAAM,CAAC,oBAAoB,mCAAmC,CAClG,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,YAAY,SAAS,WAAW;gBACzC,IAAI,EAAE,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE;aACvE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAChC,6BAA6B,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAC/D,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,SAAS,2CAA2C,CACjE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,SAAS,WAAW;QACzC,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAC9B,UAAsB,EACtB,MAAc,EACd,WAAmB,EACnB,GAAW,EACX,IAAY;IAEZ,MAAM,CAAC,IAAI,CAAC,4BAA4B,WAAW,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAEzE,uCAAuC;IACvC,gDAAgD;IAChD,yBAAyB;IAEzB,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,wCAAwC,CACzC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,UAAsB,EACtB,kBAAsC,EACtC,MAAc,EACd,SAAiB,EACjB,WAAoB,EACpB,IAAa,EACb,IAAa,EACb,MAAe;IAEf,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;IAE1D,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;IAExE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC/D,0BAA0B;QAC1B,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;QAEzD,8DAA8D;QAC9D,MAAM,YAAY,GAA4D;YAC5E,SAAS;YACT,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,oCAAoC;YAC5C,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAC/B,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,IAAI,EAAE,IAAI,IAAI,CAAC;YACf,MAAM,EAAE,MAAM,IAAI,CAAC;SACpB,CAAC;QAEF,0CAA0C;QAC1C,IAAI,IAAI,EAAE,CAAC;YACT,YAAY,CAAC,UAAU,GAAG,IAAI,CAAC;QACjC,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAErE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,WAAW,0BAA0B,SAAS,8CAA8C,CACzG,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,YAAY,WAAW,WAAW;gBAC3C,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE;aAC3E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAChC,6BAA6B,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAC/D,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe;aACvC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAE5C,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,WAAW,0BAA0B,SAAS,8CAA8C,CACzG,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,YAAY,WAAW,WAAW;QAC3C,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gBAAgB,CAC7B,UAAsB,EACtB,MAAc,EACd,WAAmB,EACnB,SAAiB;IAEjB,MAAM,CAAC,IAAI,CAAC,uCAAuC,WAAW,EAAE,CAAC,CAAC;IAElE,iCAAiC;IACjC,6CAA6C;IAC7C,wBAAwB;IACxB,gCAAgC;IAEhC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,qEAAqE,CACtE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE;KACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CACzB,UAAsB,EACtB,MAAc,EACd,WAAmB,EACnB,GAAW;IAEX,MAAM,CAAC,IAAI,CAAC,mCAAmC,WAAW,EAAE,CAAC,CAAC;IAE9D,iCAAiC;IACjC,iCAAiC;IACjC,yBAAyB;IACzB,sBAAsB;IACtB,2BAA2B;IAE3B,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,6DAA6D,CAC9D,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,kBAAkB;QAC3B,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE;KAC3B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,aAAa,CAC1B,UAAsB,EACtB,SAAsC,EACtC,kBAAsC,EACtC,MAAc,EACd,GAAY;IAEZ,MAAM,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAE9E,wBAAwB;IACxB,MAAM,eAAe,GAAG,GAAG;QACzB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;QACxE,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IAEpB,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;SAC1B,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,gCAAgC;IAChC,UAAU,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,eAAe,CAAC,MAAM,iBAAiB,CAAC,CAAC;IAEhG,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,oBAAoB,eAAe,CAAC,MAAM,uBAAuB,CAClE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,EAAE,YAAY,EAAE,eAAe,CAAC,MAAM,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,mBAAmB,CAChC,UAAsB,EACtB,kBAAsC,EACtC,MAAc,EACd,SAAkB;IAElB,MAAM,CAAC,IAAI,CAAC,0BAA0B,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE3E,yDAAyD;IACzD,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;IAExE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,aAAa,EAAE,EAAE,CAAC;QAC/D,IAAI,SAAS,EAAE,CAAC;YACd,uBAAuB;YACvB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,YAAY,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,WAAW,IAAI,gBAAgB,iBAAiB,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAC1H,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,eAAe;oBACxB,IAAI,EAAE,EAAE,OAAO,EAAE;iBAClB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;gBACxE,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,sBAAsB,SAAS,EAAE;iBACzC,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,mBAAmB;YACnB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAG,mBAAmB,CAAC,qBAAqB,EAAE,CAAC;YAC/D,MAAM,OAAO,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,CAAC;YAEzD,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,aAAa,QAAQ,CAAC,MAAM,cAAc,UAAU,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,UAAU,CACpG,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,oBAAoB;gBAC7B,IAAI,EAAE;oBACJ,QAAQ,EAAE,QAAQ,CAAC,MAAM;oBACzB,UAAU,EAAE,UAAU,CAAC,MAAM;oBAC7B,OAAO,EAAE,OAAO,CAAC,MAAM;oBACvB,QAAQ,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC;iBACvC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,qEAAqE,CACtE,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe;QACxB,IAAI,EAAE,EAAE,SAAS,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,qBAAqB,CAClC,UAAsB,EACtB,kBAAsC,EACtC,MAAc,EACd,GAAY,EACZ,SAAkB,EAClB,WAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,4BAA4B,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACpG,CAAC;IAEF,iBAAiB;IACjB,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,SAAS;YACxB,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC;YAC5D,CAAC,CAAC,WAAW,CAAC;QAEhB,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,SAAS,QAAQ,CAAC,MAAM,6BAA6B,CACtD,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,aAAa;YACxC,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE;SACjD,CAAC;IACJ,CAAC;IAED,6CAA6C;IAC7C,UAAU,CAAC,MAAM,CAAC,sBAAsB,CACtC,+BAA+B,CAChC,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;KACjC,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,UAAsB,EACtB,SAAsC,EACtC,kBAAsC,EACtC,MAAc;IAEd,OAAO;QACL,KAAK,CAAC,gBAAgB,CAAC,MAA4B;YACjD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;YAEjD,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAE9C,IAAI,CAAC;gBACH,QAAQ,OAAO,EAAE,CAAC;oBAChB,KAAK,cAAc,CAAC,eAAe;wBACjC,OAAO,MAAM,qBAAqB,CAChC,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,CAClB,CAAC;oBAEJ,KAAK,cAAc,CAAC,cAAc;wBAChC,OAAO,MAAM,oBAAoB,CAC/B,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,CAClB,CAAC;oBAEJ,KAAK,cAAc,CAAC,WAAW;wBAC7B,OAAO,MAAM,iBAAiB,CAC5B,UAAU,EACV,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,EACjB,IAAI,CAAC,CAAC,CAAW,EACjB,IAAI,CAAC,CAAC,CAAW,CAClB,CAAC;oBAEJ,KAAK,cAAc,CAAC,cAAc;wBAChC,OAAO,MAAM,oBAAoB,CAC/B,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,EACjB,IAAI,CAAC,CAAC,CAAuB,EAC7B,IAAI,CAAC,CAAC,CAAuB,EAC7B,IAAI,CAAC,CAAC,CAAuB,EAC7B,IAAI,CAAC,CAAC,CAAuB,CAC9B,CAAC;oBAEJ,KAAK,cAAc,CAAC,UAAU;wBAC5B,OAAO,MAAM,gBAAgB,CAC3B,UAAU,EACV,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,EACjB,IAAI,CAAC,CAAC,CAAW,CAClB,CAAC;oBAEJ,KAAK,cAAc,CAAC,MAAM;wBACxB,OAAO,MAAM,YAAY,CACvB,UAAU,EACV,MAAM,EACN,IAAI,CAAC,CAAC,CAAW,EACjB,IAAI,CAAC,CAAC,CAAW,CAClB,CAAC;oBAEJ,KAAK,cAAc,CAAC,MAAM;wBACxB,OAAO,MAAM,aAAa,CACxB,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAuB,CAC9B,CAAC;oBAEJ,KAAK,cAAc,CAAC,aAAa;wBAC/B,OAAO,MAAM,mBAAmB,CAC9B,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAuB,CAC9B,CAAC;oBAEJ,KAAK,cAAc,CAAC,eAAe;wBACjC,OAAO,MAAM,qBAAqB,CAChC,UAAU,EACV,kBAAkB,EAClB,MAAM,EACN,IAAI,CAAC,CAAC,CAAuB,EAC7B,IAAI,CAAC,CAAC,CAAuB,EAC7B,IAAI,CAAC,CAAC,CAAuB,CAC9B,CAAC;oBAEJ;wBACE,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;wBAC3C,OAAO;4BACL,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,oBAAoB,OAAO,EAAE;yBACrC,CAAC;gBACN,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5E,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,YAAY,YAAY,EAAE,CAAC,CAAC;gBAC3D,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,YAAY;iBACpB,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|