@achieveai/azuredevops-mcp 1.3.17 → 1.3.18
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/Interfaces/Common.js +10 -1
- package/dist/Interfaces/Common.js.map +1 -1
- package/dist/Services/AzureDevOpsService.js +234 -32
- package/dist/Services/AzureDevOpsService.js.map +1 -1
- package/dist/Services/BoardsSprintsService.js +105 -13
- package/dist/Services/BoardsSprintsService.js.map +1 -1
- package/dist/Services/BuildService.js +151 -24
- package/dist/Services/BuildService.js.map +1 -1
- package/dist/Services/GitService.js +26 -3
- package/dist/Services/GitService.js.map +1 -1
- package/dist/Services/ProjectService.js +47 -6
- package/dist/Services/ProjectService.js.map +1 -1
- package/dist/Services/WorkItemService.js +183 -142
- package/dist/Services/WorkItemService.js.map +1 -1
- package/dist/Tools/BoardsSprintsTools.js +2 -8
- package/dist/Tools/BoardsSprintsTools.js.map +1 -1
- package/dist/Tools/BuildTools.js +5 -8
- package/dist/Tools/BuildTools.js.map +1 -1
- package/dist/Tools/WorkItemTools.js +111 -74
- package/dist/Tools/WorkItemTools.js.map +1 -1
- package/dist/index.js +22 -12
- package/dist/index.js.map +1 -1
- package/dist/utils/formatHelpers.js +15 -0
- package/dist/utils/formatHelpers.js.map +1 -1
- package/package.json +2 -2
- package/dist/Services/BuildService.project.test.js +0 -91
- package/dist/Services/BuildService.project.test.js.map +0 -1
- package/dist/Services/GitService.project.test.js +0 -407
- package/dist/Services/GitService.project.test.js.map +0 -1
- package/dist/package.json +0 -59
- package/dist/src/Interfaces/AIAssisted.js +0 -3
- package/dist/src/Interfaces/AIAssisted.js.map +0 -1
- package/dist/src/Interfaces/ArtifactManagement.js +0 -3
- package/dist/src/Interfaces/ArtifactManagement.js.map +0 -1
- package/dist/src/Interfaces/AzureDevOps.js +0 -3
- package/dist/src/Interfaces/AzureDevOps.js.map +0 -1
- package/dist/src/Interfaces/BoardsAndSprints.js +0 -3
- package/dist/src/Interfaces/BoardsAndSprints.js.map +0 -1
- package/dist/src/Interfaces/CodeAndRepositories.js +0 -3
- package/dist/src/Interfaces/CodeAndRepositories.js.map +0 -1
- package/dist/src/Interfaces/Common.js +0 -134
- package/dist/src/Interfaces/Common.js.map +0 -1
- package/dist/src/Interfaces/CostResourceManagement.js +0 -3
- package/dist/src/Interfaces/CostResourceManagement.js.map +0 -1
- package/dist/src/Interfaces/DevSecOps.js +0 -3
- package/dist/src/Interfaces/DevSecOps.js.map +0 -1
- package/dist/src/Interfaces/ExternalIntegrations.js +0 -3
- package/dist/src/Interfaces/ExternalIntegrations.js.map +0 -1
- package/dist/src/Interfaces/HybridCrossPlatform.js +0 -3
- package/dist/src/Interfaces/HybridCrossPlatform.js.map +0 -1
- package/dist/src/Interfaces/Pipelines.js +0 -3
- package/dist/src/Interfaces/Pipelines.js.map +0 -1
- package/dist/src/Interfaces/ProjectManagement.js +0 -3
- package/dist/src/Interfaces/ProjectManagement.js.map +0 -1
- package/dist/src/Interfaces/TestingCapabilities.js +0 -3
- package/dist/src/Interfaces/TestingCapabilities.js.map +0 -1
- package/dist/src/Interfaces/Wiki.js +0 -3
- package/dist/src/Interfaces/Wiki.js.map +0 -1
- package/dist/src/Interfaces/WorkItems.js +0 -3
- package/dist/src/Interfaces/WorkItems.js.map +0 -1
- package/dist/src/Services/AIAssistedDevelopmentService.js +0 -195
- package/dist/src/Services/AIAssistedDevelopmentService.js.map +0 -1
- package/dist/src/Services/ArtifactManagementService.js +0 -346
- package/dist/src/Services/ArtifactManagementService.js.map +0 -1
- package/dist/src/Services/AzureDevOpsService.js +0 -385
- package/dist/src/Services/AzureDevOpsService.js.map +0 -1
- package/dist/src/Services/BoardsSprintsService.js +0 -339
- package/dist/src/Services/BoardsSprintsService.js.map +0 -1
- package/dist/src/Services/BuildService.js +0 -405
- package/dist/src/Services/BuildService.js.map +0 -1
- package/dist/src/Services/DevSecOpsService.js +0 -307
- package/dist/src/Services/DevSecOpsService.js.map +0 -1
- package/dist/src/Services/EntraAuthHandler.js +0 -337
- package/dist/src/Services/EntraAuthHandler.js.map +0 -1
- package/dist/src/Services/GitService.js +0 -1595
- package/dist/src/Services/GitService.js.map +0 -1
- package/dist/src/Services/ProjectService.js +0 -257
- package/dist/src/Services/ProjectService.js.map +0 -1
- package/dist/src/Services/TestingCapabilitiesService.js +0 -149
- package/dist/src/Services/TestingCapabilitiesService.js.map +0 -1
- package/dist/src/Services/WikiService.js +0 -90
- package/dist/src/Services/WikiService.js.map +0 -1
- package/dist/src/Services/WorkItemService.js +0 -885
- package/dist/src/Services/WorkItemService.js.map +0 -1
- package/dist/src/Tools/AIAssistedDevelopmentTools.js +0 -137
- package/dist/src/Tools/AIAssistedDevelopmentTools.js.map +0 -1
- package/dist/src/Tools/ArtifactManagementTools.js +0 -140
- package/dist/src/Tools/ArtifactManagementTools.js.map +0 -1
- package/dist/src/Tools/BoardsSprintsTools.js +0 -338
- package/dist/src/Tools/BoardsSprintsTools.js.map +0 -1
- package/dist/src/Tools/BuildTools.js +0 -468
- package/dist/src/Tools/BuildTools.js.map +0 -1
- package/dist/src/Tools/DevSecOpsTools.js +0 -147
- package/dist/src/Tools/DevSecOpsTools.js.map +0 -1
- package/dist/src/Tools/GitTools.js +0 -1475
- package/dist/src/Tools/GitTools.js.map +0 -1
- package/dist/src/Tools/ProjectTools.js +0 -360
- package/dist/src/Tools/ProjectTools.js.map +0 -1
- package/dist/src/Tools/TestingCapabilitiesTools.js +0 -157
- package/dist/src/Tools/TestingCapabilitiesTools.js.map +0 -1
- package/dist/src/Tools/WikiTools.js +0 -137
- package/dist/src/Tools/WikiTools.js.map +0 -1
- package/dist/src/Tools/WorkItemTools.js +0 -862
- package/dist/src/Tools/WorkItemTools.js.map +0 -1
- package/dist/src/config.js +0 -176
- package/dist/src/config.js.map +0 -1
- package/dist/src/index.js +0 -1716
- package/dist/src/index.js.map +0 -1
- package/dist/src/utils/formatHelpers.js +0 -257
- package/dist/src/utils/formatHelpers.js.map +0 -1
- package/dist/src/utils/getClassMethods.js +0 -8
- package/dist/src/utils/getClassMethods.js.map +0 -1
- package/dist/src/utils/repositoryResolver.js +0 -40
- package/dist/src/utils/repositoryResolver.js.map +0 -1
|
@@ -1,307 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DevSecOpsService = void 0;
|
|
4
|
-
const AzureDevOpsService_1 = require("./AzureDevOpsService");
|
|
5
|
-
class DevSecOpsService extends AzureDevOpsService_1.AzureDevOpsService {
|
|
6
|
-
constructor(config) {
|
|
7
|
-
super(config);
|
|
8
|
-
}
|
|
9
|
-
async runSecurityScan(params) {
|
|
10
|
-
// This would contain actual implementation
|
|
11
|
-
// For now, we're returning a mock response
|
|
12
|
-
return {
|
|
13
|
-
scanId: "scan-" + Math.random().toString(36).substring(2, 9),
|
|
14
|
-
repository: params.repository,
|
|
15
|
-
branch: params.branch || "main",
|
|
16
|
-
scanType: params.scanType || "all",
|
|
17
|
-
status: "initiated",
|
|
18
|
-
startTime: new Date().toISOString(),
|
|
19
|
-
estimatedCompletionTime: new Date(Date.now() + 1000 * 60 * 10).toISOString() // 10 minutes from now
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
async getSecurityScanResults(params) {
|
|
23
|
-
const severity = params.severity || "all";
|
|
24
|
-
return {
|
|
25
|
-
scanId: params.scanId,
|
|
26
|
-
status: "completed",
|
|
27
|
-
completionTime: new Date().toISOString(),
|
|
28
|
-
summary: {
|
|
29
|
-
critical: severity === "all" || severity === "critical" ? 3 : 0,
|
|
30
|
-
high: severity === "all" || severity === "high" ? 8 : 0,
|
|
31
|
-
medium: severity === "all" || severity === "medium" ? 15 : 0,
|
|
32
|
-
low: severity === "all" || severity === "low" ? 24 : 0
|
|
33
|
-
},
|
|
34
|
-
findings: [
|
|
35
|
-
{
|
|
36
|
-
id: "vul-1",
|
|
37
|
-
title: "SQL Injection vulnerability",
|
|
38
|
-
severity: "critical",
|
|
39
|
-
location: "src/data/queries.ts:42",
|
|
40
|
-
description: "Potential SQL injection detected in unvalidated user input"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
id: "vul-2",
|
|
44
|
-
title: "Cross-site scripting (XSS)",
|
|
45
|
-
severity: "high",
|
|
46
|
-
location: "src/ui/userProfile.tsx:67",
|
|
47
|
-
description: "User input rendered directly to DOM without sanitization"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
id: "vul-3",
|
|
51
|
-
title: "Outdated npm package",
|
|
52
|
-
severity: "medium",
|
|
53
|
-
location: "package.json",
|
|
54
|
-
description: "Package 'axios' has known vulnerabilities in version 0.19.0"
|
|
55
|
-
}
|
|
56
|
-
]
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
async trackSecurityVulnerabilities(params) {
|
|
60
|
-
return {
|
|
61
|
-
vulnerabilities: [
|
|
62
|
-
{
|
|
63
|
-
id: "vul-1",
|
|
64
|
-
title: "SQL Injection vulnerability",
|
|
65
|
-
status: "in-progress",
|
|
66
|
-
assignedTo: "jane.developer@example.com",
|
|
67
|
-
discoveredDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(), // 7 days ago
|
|
68
|
-
lastUpdatedDate: new Date().toISOString()
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
id: "vul-2",
|
|
72
|
-
title: "Cross-site scripting (XSS)",
|
|
73
|
-
status: "mitigated",
|
|
74
|
-
assignedTo: "john.securityexpert@example.com",
|
|
75
|
-
discoveredDate: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString(), // 14 days ago
|
|
76
|
-
lastUpdatedDate: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString() // 2 days ago
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: "vul-3",
|
|
80
|
-
title: "Outdated npm package",
|
|
81
|
-
status: "resolved",
|
|
82
|
-
assignedTo: "deployment.team@example.com",
|
|
83
|
-
discoveredDate: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(), // 30 days ago
|
|
84
|
-
lastUpdatedDate: new Date(Date.now() - 25 * 24 * 60 * 60 * 1000).toISOString() // 25 days ago
|
|
85
|
-
}
|
|
86
|
-
],
|
|
87
|
-
statistics: {
|
|
88
|
-
open: 5,
|
|
89
|
-
inProgress: 8,
|
|
90
|
-
mitigated: 12,
|
|
91
|
-
resolved: 27,
|
|
92
|
-
falsePositive: 4
|
|
93
|
-
},
|
|
94
|
-
timeRange: params.timeRange || "90d"
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
async generateSecurityCompliance(params) {
|
|
98
|
-
const standardType = params.standardType || "owasp";
|
|
99
|
-
return {
|
|
100
|
-
standardType,
|
|
101
|
-
generatedDate: new Date().toISOString(),
|
|
102
|
-
overallCompliance: 78.5,
|
|
103
|
-
categories: [
|
|
104
|
-
{
|
|
105
|
-
name: "Authentication Controls",
|
|
106
|
-
compliance: 92.3,
|
|
107
|
-
requirements: 12,
|
|
108
|
-
passedRequirements: 11
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
name: "Access Controls",
|
|
112
|
-
compliance: 85.7,
|
|
113
|
-
requirements: 14,
|
|
114
|
-
passedRequirements: 12
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
name: "Data Protection",
|
|
118
|
-
compliance: 66.7,
|
|
119
|
-
requirements: 9,
|
|
120
|
-
passedRequirements: 6
|
|
121
|
-
}
|
|
122
|
-
],
|
|
123
|
-
evidence: params.includeEvidence ? {
|
|
124
|
-
documentationLinks: ["https://docs.example.com/security/auth", "https://docs.example.com/security/data"],
|
|
125
|
-
testResults: ["pipeline/security/results/123.json"],
|
|
126
|
-
screenshots: ["evidence/login-screen.png", "evidence/data-encryption.png"]
|
|
127
|
-
} : undefined
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
async integrateSarifResults(params) {
|
|
131
|
-
return {
|
|
132
|
-
filePath: params.sarifFilePath,
|
|
133
|
-
processed: true,
|
|
134
|
-
importedResults: 42,
|
|
135
|
-
workItemsCreated: params.createWorkItems ? 18 : 0,
|
|
136
|
-
summary: {
|
|
137
|
-
critical: 3,
|
|
138
|
-
high: 7,
|
|
139
|
-
medium: 12,
|
|
140
|
-
low: 20
|
|
141
|
-
},
|
|
142
|
-
tools: ["SonarQube", "ESLint Security Plugin"]
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
async runComplianceChecks(params) {
|
|
146
|
-
return {
|
|
147
|
-
complianceStandard: params.complianceStandard,
|
|
148
|
-
scopeId: params.scopeId || "organization",
|
|
149
|
-
status: "completed",
|
|
150
|
-
completionTime: new Date().toISOString(),
|
|
151
|
-
overallCompliance: 82.5,
|
|
152
|
-
passedChecks: 33,
|
|
153
|
-
failedChecks: 7,
|
|
154
|
-
waivedChecks: 2,
|
|
155
|
-
criticalFailures: 1,
|
|
156
|
-
recommendations: [
|
|
157
|
-
"Enable MFA for all developer accounts",
|
|
158
|
-
"Implement branch protection policies",
|
|
159
|
-
"Set up container vulnerability scanning"
|
|
160
|
-
]
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
async getComplianceStatus(params) {
|
|
164
|
-
return {
|
|
165
|
-
standardId: params.standardId || "iso27001",
|
|
166
|
-
lastChecked: new Date().toISOString(),
|
|
167
|
-
overallCompliance: 87.3,
|
|
168
|
-
statusByCategory: {
|
|
169
|
-
"Access Control": { compliance: 92.0, status: "compliant" },
|
|
170
|
-
"System Acquisition": { compliance: 76.5, status: "partially-compliant" },
|
|
171
|
-
"Cryptography": { compliance: 100.0, status: "compliant" },
|
|
172
|
-
"Physical Security": { compliance: 80.0, status: "partially-compliant" }
|
|
173
|
-
},
|
|
174
|
-
history: params.includeHistory ? [
|
|
175
|
-
{ date: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(), compliance: 78.9 },
|
|
176
|
-
{ date: new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString(), compliance: 75.2 },
|
|
177
|
-
{ date: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(), compliance: 72.1 }
|
|
178
|
-
] : undefined
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
async createComplianceReport(params) {
|
|
182
|
-
return {
|
|
183
|
-
standardId: params.standardId,
|
|
184
|
-
format: params.format || "pdf",
|
|
185
|
-
reportUrl: `https://reports.example.com/compliance/${params.standardId}/report-${Date.now()}.${params.format || "pdf"}`,
|
|
186
|
-
generatedDate: new Date().toISOString(),
|
|
187
|
-
expiryDate: new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toISOString(), // 90 days from now
|
|
188
|
-
reportSize: "2.4 MB"
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
async manageSecurityPolicies(params) {
|
|
192
|
-
return {
|
|
193
|
-
policyName: params.policyName,
|
|
194
|
-
action: params.action,
|
|
195
|
-
status: "success",
|
|
196
|
-
appliedTo: ["ProjectX", "ProjectY"],
|
|
197
|
-
effectiveDate: new Date().toISOString(),
|
|
198
|
-
createdBy: "security.admin@example.com",
|
|
199
|
-
version: 3,
|
|
200
|
-
definition: params.policyDefinition || {
|
|
201
|
-
"requiredReviewers": 2,
|
|
202
|
-
"branchProtection": true,
|
|
203
|
-
"requireSecurityScan": true
|
|
204
|
-
}
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
async trackSecurityAwareness(params) {
|
|
208
|
-
return {
|
|
209
|
-
teamId: params.teamId || "all-teams",
|
|
210
|
-
completionRate: 78.3,
|
|
211
|
-
trainingModules: [
|
|
212
|
-
{
|
|
213
|
-
id: "sec-101",
|
|
214
|
-
name: "Security Basics",
|
|
215
|
-
completionRate: 95.2,
|
|
216
|
-
averageScore: 87.5
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
id: "secure-coding",
|
|
220
|
-
name: "Secure Coding Practices",
|
|
221
|
-
completionRate: 82.1,
|
|
222
|
-
averageScore: 79.3
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
id: "threat-modeling",
|
|
226
|
-
name: "Threat Modeling Workshop",
|
|
227
|
-
completionRate: 64.5,
|
|
228
|
-
averageScore: 81.9
|
|
229
|
-
}
|
|
230
|
-
],
|
|
231
|
-
topPerformers: [
|
|
232
|
-
"alex.developer@example.com",
|
|
233
|
-
"jamie.architect@example.com",
|
|
234
|
-
"robin.qa@example.com"
|
|
235
|
-
],
|
|
236
|
-
needsAttention: [
|
|
237
|
-
"new.hire@example.com",
|
|
238
|
-
"busy.manager@example.com"
|
|
239
|
-
],
|
|
240
|
-
timeRange: params.timeRange || "90d"
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
async rotateSecrets(params) {
|
|
244
|
-
return {
|
|
245
|
-
secretName: params.secretName || "all-applicable-secrets",
|
|
246
|
-
secretType: params.secretType || "all",
|
|
247
|
-
status: "rotated",
|
|
248
|
-
rotatedCount: params.secretName ? 1 : 12,
|
|
249
|
-
previousExpiryDate: new Date().toISOString(),
|
|
250
|
-
newExpiryDate: new Date(Date.now() + 180 * 24 * 60 * 60 * 1000).toISOString(), // 180 days from now
|
|
251
|
-
affectedServices: [
|
|
252
|
-
"api-gateway",
|
|
253
|
-
"authentication-service",
|
|
254
|
-
"payment-processor"
|
|
255
|
-
],
|
|
256
|
-
force: params.force || false
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
async auditSecretUsage(params) {
|
|
260
|
-
return {
|
|
261
|
-
secretName: params.secretName || "all-secrets",
|
|
262
|
-
timeRange: params.timeRange || "30d",
|
|
263
|
-
totalUsage: 1842,
|
|
264
|
-
usageByService: {
|
|
265
|
-
"api-gateway": 723,
|
|
266
|
-
"user-service": 512,
|
|
267
|
-
"payment-service": 318,
|
|
268
|
-
"notification-service": 289
|
|
269
|
-
},
|
|
270
|
-
unusedSecrets: [
|
|
271
|
-
"legacy-api-key",
|
|
272
|
-
"test-database-password"
|
|
273
|
-
],
|
|
274
|
-
highUsageSecrets: [
|
|
275
|
-
"main-database-connection",
|
|
276
|
-
"authentication-token"
|
|
277
|
-
],
|
|
278
|
-
recommendations: [
|
|
279
|
-
"Remove unused secrets 'legacy-api-key' and 'test-database-password'",
|
|
280
|
-
"Consider creating service-specific credentials for 'authentication-token'"
|
|
281
|
-
]
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
async vaultIntegration(params) {
|
|
285
|
-
return {
|
|
286
|
-
vaultUrl: params.vaultUrl,
|
|
287
|
-
secretPath: params.secretPath || "/",
|
|
288
|
-
action: params.action,
|
|
289
|
-
status: "success",
|
|
290
|
-
timestamp: new Date().toISOString(),
|
|
291
|
-
secrets: params.action === "list" ? [
|
|
292
|
-
"api-key",
|
|
293
|
-
"database-password",
|
|
294
|
-
"jwt-signing-key"
|
|
295
|
-
] : undefined,
|
|
296
|
-
secretValue: params.action === "get" ? {
|
|
297
|
-
// This would be the actual secret value if this were a real implementation
|
|
298
|
-
// Here we just return a placeholder
|
|
299
|
-
value: "[SECRET_RETRIEVED]",
|
|
300
|
-
version: 3,
|
|
301
|
-
created: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString()
|
|
302
|
-
} : undefined
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
exports.DevSecOpsService = DevSecOpsService;
|
|
307
|
-
//# sourceMappingURL=DevSecOpsService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DevSecOpsService.js","sourceRoot":"","sources":["../../../src/Services/DevSecOpsService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,337 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.EntraAuthHandler = exports.TokenCredentialAuthHandler = void 0;
|
|
37
|
-
const identity_1 = require("@azure/identity");
|
|
38
|
-
const identity_2 = require("@azure/identity");
|
|
39
|
-
const identity_cache_persistence_1 = require("@azure/identity-cache-persistence");
|
|
40
|
-
const azdev = __importStar(require("azure-devops-node-api"));
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
|
-
const path = __importStar(require("path"));
|
|
43
|
-
const os = __importStar(require("os"));
|
|
44
|
-
// Enable persistent token cache (encrypted via DPAPI on Windows, Keychain on macOS, libsecret on Linux)
|
|
45
|
-
try {
|
|
46
|
-
(0, identity_2.useIdentityPlugin)(identity_cache_persistence_1.cachePersistencePlugin);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// Plugin may already be registered or unavailable - continue without persistence
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Azure DevOps scope for token requests.
|
|
53
|
-
*/
|
|
54
|
-
const AZURE_DEVOPS_SCOPE = "499b84ac-1321-427f-aa17-267ca6975798/.default";
|
|
55
|
-
/** Shared token cache options - enables silent re-auth on subsequent starts. */
|
|
56
|
-
const TOKEN_CACHE_OPTIONS = { enabled: true };
|
|
57
|
-
// --- AuthenticationRecord persistence helpers ---
|
|
58
|
-
/** Derive a filesystem-safe label from the org URL (e.g. "dev.azure.com/myorg" → "dev.azure.com-myorg"). */
|
|
59
|
-
function orgUrlToLabel() {
|
|
60
|
-
const orgUrl = process.env.AZURE_DEVOPS_ORG_URL || "default";
|
|
61
|
-
return orgUrl.replace(/^https?:\/\//, "").replace(/[/\\:*?"<>|]+/g, "-").replace(/-+$/, "");
|
|
62
|
-
}
|
|
63
|
-
function getAuthRecordDir() {
|
|
64
|
-
return path.join(os.homedir(), ".azuredevops-mcp");
|
|
65
|
-
}
|
|
66
|
-
function getAuthRecordPath(label) {
|
|
67
|
-
return path.join(getAuthRecordDir(), `auth-record-${label}.json`);
|
|
68
|
-
}
|
|
69
|
-
function loadAuthRecord(label) {
|
|
70
|
-
try {
|
|
71
|
-
const filePath = getAuthRecordPath(label);
|
|
72
|
-
if (!fs.existsSync(filePath))
|
|
73
|
-
return undefined;
|
|
74
|
-
const raw = fs.readFileSync(filePath, "utf-8");
|
|
75
|
-
return (0, identity_1.deserializeAuthenticationRecord)(raw);
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
function saveAuthRecord(label, record) {
|
|
82
|
-
try {
|
|
83
|
-
const dir = getAuthRecordDir();
|
|
84
|
-
if (!fs.existsSync(dir)) {
|
|
85
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
86
|
-
}
|
|
87
|
-
fs.writeFileSync(getAuthRecordPath(label), (0, identity_1.serializeAuthenticationRecord)(record), "utf-8");
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
console.error(`[Auth] Failed to save auth record for "${label}":`, err);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/** Persist the bearer token to a shared file so external scripts/skills can use it. */
|
|
94
|
-
function saveAccessToken(label, token) {
|
|
95
|
-
try {
|
|
96
|
-
const dir = getAuthRecordDir();
|
|
97
|
-
if (!fs.existsSync(dir)) {
|
|
98
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
99
|
-
}
|
|
100
|
-
const tokenPath = path.join(dir, `access-token-${label}.json`);
|
|
101
|
-
fs.writeFileSync(tokenPath, JSON.stringify({
|
|
102
|
-
accessToken: token.token,
|
|
103
|
-
expiresOnTimestamp: token.expiresOnTimestamp,
|
|
104
|
-
orgUrl: process.env.AZURE_DEVOPS_ORG_URL || "",
|
|
105
|
-
project: process.env.AZURE_DEVOPS_PROJECT || "",
|
|
106
|
-
}), "utf-8");
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
console.error(`[Auth] Failed to save access token for "${label}":`, err);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
function deleteAuthRecord(label) {
|
|
113
|
-
try {
|
|
114
|
-
const filePath = getAuthRecordPath(label);
|
|
115
|
-
if (fs.existsSync(filePath)) {
|
|
116
|
-
fs.unlinkSync(filePath);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
catch {
|
|
120
|
-
// ignore
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Generic auth handler that wraps any @azure/identity TokenCredential.
|
|
125
|
-
* Supports automatic token refresh and re-authentication on 401.
|
|
126
|
-
*/
|
|
127
|
-
class TokenCredentialAuthHandler {
|
|
128
|
-
constructor(credential) {
|
|
129
|
-
this.credential = credential;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Create handler using InteractiveBrowserCredential with persistent token cache.
|
|
133
|
-
* First run opens a browser for login; subsequent runs use the cached token silently.
|
|
134
|
-
*/
|
|
135
|
-
static async createEntra() {
|
|
136
|
-
return TokenCredentialAuthHandler.createWithAuthRecord(orgUrlToLabel(), {
|
|
137
|
-
redirectUri: "http://localhost",
|
|
138
|
-
tokenCachePersistenceOptions: TOKEN_CACHE_OPTIONS,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Create handler from AzureCliCredential.
|
|
143
|
-
*/
|
|
144
|
-
static async createAzureCli(tenantId) {
|
|
145
|
-
const credential = new identity_1.AzureCliCredential(tenantId ? { tenantId } : undefined);
|
|
146
|
-
const handler = new TokenCredentialAuthHandler(credential);
|
|
147
|
-
handler.authRecordLabel = orgUrlToLabel();
|
|
148
|
-
await handler.ensureToken();
|
|
149
|
-
handler.startProactiveRefresh();
|
|
150
|
-
return handler;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Create handler from InteractiveBrowserCredential (MSAL).
|
|
154
|
-
* Opens a browser window for user login with token caching and silent re-auth.
|
|
155
|
-
*/
|
|
156
|
-
static async createInteractive(options) {
|
|
157
|
-
return TokenCredentialAuthHandler.createWithAuthRecord(orgUrlToLabel(), {
|
|
158
|
-
...(options?.tenantId && { tenantId: options.tenantId }),
|
|
159
|
-
...(options?.clientId && { clientId: options.clientId }),
|
|
160
|
-
redirectUri: "http://localhost",
|
|
161
|
-
tokenCachePersistenceOptions: TOKEN_CACHE_OPTIONS,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Shared helper: attempts silent auth with a saved AuthenticationRecord,
|
|
166
|
-
* falls back to interactive browser login and persists the new record.
|
|
167
|
-
*/
|
|
168
|
-
static async createWithAuthRecord(label, credentialOptions) {
|
|
169
|
-
// 1. Try loading a previously saved AuthenticationRecord
|
|
170
|
-
const existingRecord = loadAuthRecord(label);
|
|
171
|
-
if (existingRecord) {
|
|
172
|
-
try {
|
|
173
|
-
// Probe with disableAutomaticAuthentication to prevent browser popup.
|
|
174
|
-
// If the refresh token is expired, this throws AuthenticationRequiredError
|
|
175
|
-
// instead of silently opening a browser.
|
|
176
|
-
const probe = new identity_1.InteractiveBrowserCredential({
|
|
177
|
-
...credentialOptions,
|
|
178
|
-
authenticationRecord: existingRecord,
|
|
179
|
-
disableAutomaticAuthentication: true,
|
|
180
|
-
});
|
|
181
|
-
const token = await probe.getToken(AZURE_DEVOPS_SCOPE);
|
|
182
|
-
if (token) {
|
|
183
|
-
console.error(`[Auth] Silent authentication succeeded for "${label}".`);
|
|
184
|
-
// Create the REAL credential WITHOUT disableAutomaticAuthentication
|
|
185
|
-
// so that ensureToken() can silently refresh during the server's lifetime.
|
|
186
|
-
const credential = new identity_1.InteractiveBrowserCredential({
|
|
187
|
-
...credentialOptions,
|
|
188
|
-
authenticationRecord: existingRecord,
|
|
189
|
-
});
|
|
190
|
-
const handler = new TokenCredentialAuthHandler(credential);
|
|
191
|
-
handler.authRecordLabel = label;
|
|
192
|
-
handler.credentialOptions = credentialOptions;
|
|
193
|
-
handler.token = token;
|
|
194
|
-
handler.authHandler = azdev.getHandlerFromToken(token.token);
|
|
195
|
-
saveAccessToken(label, token);
|
|
196
|
-
handler.startProactiveRefresh();
|
|
197
|
-
return handler;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
catch {
|
|
201
|
-
// Silent auth failed — stale record, token revoked, etc.
|
|
202
|
-
console.error(`[Auth] Silent auth failed for "${label}", falling back to interactive login.`);
|
|
203
|
-
deleteAuthRecord(label);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
// 2. No valid cached record — do interactive browser login
|
|
207
|
-
const credential = new identity_1.InteractiveBrowserCredential(credentialOptions);
|
|
208
|
-
const authRecord = await credential.authenticate(AZURE_DEVOPS_SCOPE);
|
|
209
|
-
if (authRecord) {
|
|
210
|
-
saveAuthRecord(label, authRecord);
|
|
211
|
-
console.error(`[Auth] Authentication record saved for "${label}".`);
|
|
212
|
-
}
|
|
213
|
-
const handler = new TokenCredentialAuthHandler(credential);
|
|
214
|
-
handler.authRecordLabel = label;
|
|
215
|
-
handler.credentialOptions = credentialOptions;
|
|
216
|
-
await handler.ensureToken();
|
|
217
|
-
handler.startProactiveRefresh();
|
|
218
|
-
return handler;
|
|
219
|
-
}
|
|
220
|
-
isTokenExpired() {
|
|
221
|
-
const currentTime = new Date().getTime();
|
|
222
|
-
return this.token.expiresOnTimestamp <= currentTime + 60000;
|
|
223
|
-
}
|
|
224
|
-
async ensureToken() {
|
|
225
|
-
if (!this.token || this.isTokenExpired()) {
|
|
226
|
-
try {
|
|
227
|
-
const token = await this.credential.getToken(AZURE_DEVOPS_SCOPE);
|
|
228
|
-
if (!token)
|
|
229
|
-
throw new Error("getToken returned null");
|
|
230
|
-
this.token = token;
|
|
231
|
-
this.authHandler = azdev.getHandlerFromToken(this.token.token);
|
|
232
|
-
if (this.authRecordLabel)
|
|
233
|
-
saveAccessToken(this.authRecordLabel, token);
|
|
234
|
-
}
|
|
235
|
-
catch (err) {
|
|
236
|
-
// Self-heal: rebuild credential from saved auth record (same as a restart).
|
|
237
|
-
if (this.authRecordLabel && this.credentialOptions) {
|
|
238
|
-
console.error(`[Auth] Token refresh failed, attempting self-heal for "${this.authRecordLabel}"...`);
|
|
239
|
-
const record = loadAuthRecord(this.authRecordLabel);
|
|
240
|
-
if (record) {
|
|
241
|
-
const freshCredential = new identity_1.InteractiveBrowserCredential({
|
|
242
|
-
...this.credentialOptions,
|
|
243
|
-
authenticationRecord: record,
|
|
244
|
-
});
|
|
245
|
-
const token = await freshCredential.getToken(AZURE_DEVOPS_SCOPE);
|
|
246
|
-
if (token) {
|
|
247
|
-
console.error(`[Auth] Self-heal succeeded for "${this.authRecordLabel}".`);
|
|
248
|
-
this.credential = freshCredential;
|
|
249
|
-
this.token = token;
|
|
250
|
-
this.authHandler = azdev.getHandlerFromToken(token.token);
|
|
251
|
-
saveAccessToken(this.authRecordLabel, token);
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
throw new Error(`Failed to acquire Azure DevOps access token: ${err}`);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Start a background timer that refreshes the token before it expires.
|
|
262
|
-
* Default interval: 45 minutes (Azure AD tokens typically last 60-90 min).
|
|
263
|
-
*/
|
|
264
|
-
startProactiveRefresh(intervalMs = 45 * 60 * 1000) {
|
|
265
|
-
this.stopProactiveRefresh();
|
|
266
|
-
this.refreshTimer = setInterval(async () => {
|
|
267
|
-
try {
|
|
268
|
-
this.token = undefined;
|
|
269
|
-
await this.ensureToken();
|
|
270
|
-
console.error(`[Auth] Proactive token refresh succeeded.`);
|
|
271
|
-
}
|
|
272
|
-
catch (err) {
|
|
273
|
-
console.error(`[Auth] Proactive token refresh failed:`, err);
|
|
274
|
-
}
|
|
275
|
-
}, intervalMs);
|
|
276
|
-
// Don't keep the Node process alive just for this timer
|
|
277
|
-
if (this.refreshTimer && typeof this.refreshTimer === 'object' && 'unref' in this.refreshTimer) {
|
|
278
|
-
this.refreshTimer.unref();
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Force-clear the cached token and acquire a fresh one.
|
|
283
|
-
* Used by the service-layer withAuthRetry() wrapper.
|
|
284
|
-
*/
|
|
285
|
-
async forceRefresh() {
|
|
286
|
-
this.token = undefined;
|
|
287
|
-
await this.ensureToken();
|
|
288
|
-
}
|
|
289
|
-
stopProactiveRefresh() {
|
|
290
|
-
if (this.refreshTimer) {
|
|
291
|
-
clearInterval(this.refreshTimer);
|
|
292
|
-
this.refreshTimer = undefined;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
prepareRequest(options) {
|
|
296
|
-
if (this.authHandler) {
|
|
297
|
-
this.authHandler.prepareRequest(options);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
canHandleAuthentication(response) {
|
|
301
|
-
// Don't delegate to inner BearerCredentialHandler — it always returns false.
|
|
302
|
-
// Handle 401/403 directly so the HttpClient invokes handleAuthentication() for retry.
|
|
303
|
-
const statusCode = response.message?.statusCode;
|
|
304
|
-
return statusCode === 401 || statusCode === 403;
|
|
305
|
-
}
|
|
306
|
-
async handleAuthentication(httpClient, requestInfo, objs) {
|
|
307
|
-
// Force a fresh token (old one triggered 401/403)
|
|
308
|
-
this.token = undefined;
|
|
309
|
-
await this.ensureToken();
|
|
310
|
-
// Apply fresh auth headers to the retried request
|
|
311
|
-
if (this.authHandler) {
|
|
312
|
-
this.authHandler.prepareRequest(requestInfo.options);
|
|
313
|
-
}
|
|
314
|
-
// Retry the original request with refreshed credentials
|
|
315
|
-
return httpClient.requestRaw(requestInfo, objs);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
exports.TokenCredentialAuthHandler = TokenCredentialAuthHandler;
|
|
319
|
-
/**
|
|
320
|
-
* @deprecated Use TokenCredentialAuthHandler.createEntra() instead.
|
|
321
|
-
* Kept for backward compatibility.
|
|
322
|
-
*/
|
|
323
|
-
class EntraAuthHandler extends TokenCredentialAuthHandler {
|
|
324
|
-
constructor() {
|
|
325
|
-
super(new identity_1.DefaultAzureCredential());
|
|
326
|
-
}
|
|
327
|
-
static async getInstance() {
|
|
328
|
-
if (!EntraAuthHandler.instance) {
|
|
329
|
-
EntraAuthHandler.instance = new EntraAuthHandler();
|
|
330
|
-
}
|
|
331
|
-
// Ensure initial token is acquired
|
|
332
|
-
await EntraAuthHandler.instance.ensureToken();
|
|
333
|
-
return EntraAuthHandler.instance;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
exports.EntraAuthHandler = EntraAuthHandler;
|
|
337
|
-
//# sourceMappingURL=EntraAuthHandler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EntraAuthHandler.js","sourceRoot":"","sources":["../../../src/Services/EntraAuthHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CASyB;AACzB,8CAAoD;AACpD,kFAA2E;AAG3E,6DAA+C;AAC/C,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAEzB,wGAAwG;AACxG,IAAI,CAAC;IACH,IAAA,4BAAiB,EAAC,mDAAsB,CAAC,CAAC;AAC5C,CAAC;AAAC,MAAM,CAAC;IACP,iFAAiF;AACnF,CAAC;AAED;;GAEG;AACH,MAAM,kBAAkB,GAAG,+CAA+C,CAAC;AAE3E,gFAAgF;AAChF,MAAM,mBAAmB,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAE9C,mDAAmD;AAEnD,4GAA4G;AAC5G,SAAS,aAAa;IACpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,SAAS,CAAC;IAC7D,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,IAAA,0CAA+B,EAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,MAA4B;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAA,wCAA6B,EAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC7F,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,eAAe,CAAC,KAAa,EAAE,KAAkB;IACxD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC;QAC/D,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC;YACzC,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;YAC9C,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;SAChD,CAAC,EAAE,OAAO,CAAC,CAAC;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAa,0BAA0B;IAUrC,YAAY,UAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,OAAO,0BAA0B,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE;YACtE,WAAW,EAAE,kBAAkB;YAC/B,4BAA4B,EAAE,mBAAmB;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,QAAiB;QAClD,MAAM,UAAU,GAAG,IAAI,6BAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,CAAC,eAAe,GAAG,aAAa,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAkD;QACtF,OAAO,0BAA0B,CAAC,oBAAoB,CAAC,aAAa,EAAE,EAAE;YACtE,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxD,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxD,WAAW,EAAE,kBAAkB;YAC/B,4BAA4B,EAAE,mBAAmB;SAClD,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,KAAK,CAAC,oBAAoB,CACvC,KAAa,EACb,iBAAgF;QAEhF,yDAAyD;QACzD,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,sEAAsE;gBACtE,2EAA2E;gBAC3E,yCAAyC;gBACzC,MAAM,KAAK,GAAG,IAAI,uCAA4B,CAAC;oBAC7C,GAAG,iBAAiB;oBACpB,oBAAoB,EAAE,cAAc;oBACpC,8BAA8B,EAAE,IAAI;iBACrC,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,KAAK,CAAC,+CAA+C,KAAK,IAAI,CAAC,CAAC;oBACxE,oEAAoE;oBACpE,2EAA2E;oBAC3E,MAAM,UAAU,GAAG,IAAI,uCAA4B,CAAC;wBAClD,GAAG,iBAAiB;wBACpB,oBAAoB,EAAE,cAAc;qBACrC,CAAC,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAAC,UAAU,CAAC,CAAC;oBAC3D,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;oBAChC,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;oBAC9C,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;oBACtB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC7D,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;oBAC9B,OAAO,CAAC,qBAAqB,EAAE,CAAC;oBAChC,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yDAAyD;gBACzD,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,uCAAuC,CAAC,CAAC;gBAC9F,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,MAAM,UAAU,GAAG,IAAI,uCAA4B,CAAC,iBAAiB,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;QACrE,IAAI,UAAU,EAAE,CAAC;YACf,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,2CAA2C,KAAK,IAAI,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,CAAC,eAAe,GAAG,KAAK,CAAC;QAChC,OAAO,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC9C,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,cAAc;QACpB,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,KAAM,CAAC,kBAAkB,IAAI,WAAW,GAAG,KAAK,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBACjE,IAAI,CAAC,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACtD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC/D,IAAI,IAAI,CAAC,eAAe;oBAAE,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,4EAA4E;gBAC5E,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACnD,OAAO,CAAC,KAAK,CAAC,0DAA0D,IAAI,CAAC,eAAe,MAAM,CAAC,CAAC;oBACpG,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBACpD,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,eAAe,GAAG,IAAI,uCAA4B,CAAC;4BACvD,GAAG,IAAI,CAAC,iBAAiB;4BACzB,oBAAoB,EAAE,MAAM;yBAC7B,CAAC,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;wBACjE,IAAI,KAAK,EAAE,CAAC;4BACV,OAAO,CAAC,KAAK,CAAC,mCAAmC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC;4BAC3E,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC;4BAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;4BACnB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;4BAC1D,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;4BAC7C,OAAO;wBACT,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,qBAAqB,CAAC,aAAqB,EAAE,GAAG,EAAE,GAAG,IAAI;QAC9D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;gBACvB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;gBACzB,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC,EAAE,UAAU,CAAC,CAAC;QACf,wDAAwD;QACxD,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/F,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,YAAY;QACvB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC;IAEM,oBAAoB;QACzB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,OAA0C;QAC9D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAEM,uBAAuB,CAC5B,QAA+C;QAE/C,6EAA6E;QAC7E,sFAAsF;QACtF,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;QAChD,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAC;IAClD,CAAC;IAEM,KAAK,CAAC,oBAAoB,CAC/B,UAAyC,EACzC,WAA2C,EAC3C,IAAS;QAET,kDAAkD;QAClD,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzB,kDAAkD;QAClD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC;QAED,wDAAwD;QACxD,OAAO,UAAU,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;CACF;AA3ND,gEA2NC;AAED;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,0BAA0B;IAG9D;QACE,KAAK,CAAC,IAAI,iCAAsB,EAAE,CAAC,CAAC;IACtC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,WAAW;QAC7B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YAC/B,gBAAgB,CAAC,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACrD,CAAC;QACD,mCAAmC;QACnC,MAAO,gBAAgB,CAAC,QAAgB,CAAC,WAAW,EAAE,CAAC;QACvD,OAAO,gBAAgB,CAAC,QAAQ,CAAC;IACnC,CAAC;CACF;AAfD,4CAeC"}
|