@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.
Files changed (114) hide show
  1. package/dist/Interfaces/Common.js +10 -1
  2. package/dist/Interfaces/Common.js.map +1 -1
  3. package/dist/Services/AzureDevOpsService.js +234 -32
  4. package/dist/Services/AzureDevOpsService.js.map +1 -1
  5. package/dist/Services/BoardsSprintsService.js +105 -13
  6. package/dist/Services/BoardsSprintsService.js.map +1 -1
  7. package/dist/Services/BuildService.js +151 -24
  8. package/dist/Services/BuildService.js.map +1 -1
  9. package/dist/Services/GitService.js +26 -3
  10. package/dist/Services/GitService.js.map +1 -1
  11. package/dist/Services/ProjectService.js +47 -6
  12. package/dist/Services/ProjectService.js.map +1 -1
  13. package/dist/Services/WorkItemService.js +183 -142
  14. package/dist/Services/WorkItemService.js.map +1 -1
  15. package/dist/Tools/BoardsSprintsTools.js +2 -8
  16. package/dist/Tools/BoardsSprintsTools.js.map +1 -1
  17. package/dist/Tools/BuildTools.js +5 -8
  18. package/dist/Tools/BuildTools.js.map +1 -1
  19. package/dist/Tools/WorkItemTools.js +111 -74
  20. package/dist/Tools/WorkItemTools.js.map +1 -1
  21. package/dist/index.js +22 -12
  22. package/dist/index.js.map +1 -1
  23. package/dist/utils/formatHelpers.js +15 -0
  24. package/dist/utils/formatHelpers.js.map +1 -1
  25. package/package.json +2 -2
  26. package/dist/Services/BuildService.project.test.js +0 -91
  27. package/dist/Services/BuildService.project.test.js.map +0 -1
  28. package/dist/Services/GitService.project.test.js +0 -407
  29. package/dist/Services/GitService.project.test.js.map +0 -1
  30. package/dist/package.json +0 -59
  31. package/dist/src/Interfaces/AIAssisted.js +0 -3
  32. package/dist/src/Interfaces/AIAssisted.js.map +0 -1
  33. package/dist/src/Interfaces/ArtifactManagement.js +0 -3
  34. package/dist/src/Interfaces/ArtifactManagement.js.map +0 -1
  35. package/dist/src/Interfaces/AzureDevOps.js +0 -3
  36. package/dist/src/Interfaces/AzureDevOps.js.map +0 -1
  37. package/dist/src/Interfaces/BoardsAndSprints.js +0 -3
  38. package/dist/src/Interfaces/BoardsAndSprints.js.map +0 -1
  39. package/dist/src/Interfaces/CodeAndRepositories.js +0 -3
  40. package/dist/src/Interfaces/CodeAndRepositories.js.map +0 -1
  41. package/dist/src/Interfaces/Common.js +0 -134
  42. package/dist/src/Interfaces/Common.js.map +0 -1
  43. package/dist/src/Interfaces/CostResourceManagement.js +0 -3
  44. package/dist/src/Interfaces/CostResourceManagement.js.map +0 -1
  45. package/dist/src/Interfaces/DevSecOps.js +0 -3
  46. package/dist/src/Interfaces/DevSecOps.js.map +0 -1
  47. package/dist/src/Interfaces/ExternalIntegrations.js +0 -3
  48. package/dist/src/Interfaces/ExternalIntegrations.js.map +0 -1
  49. package/dist/src/Interfaces/HybridCrossPlatform.js +0 -3
  50. package/dist/src/Interfaces/HybridCrossPlatform.js.map +0 -1
  51. package/dist/src/Interfaces/Pipelines.js +0 -3
  52. package/dist/src/Interfaces/Pipelines.js.map +0 -1
  53. package/dist/src/Interfaces/ProjectManagement.js +0 -3
  54. package/dist/src/Interfaces/ProjectManagement.js.map +0 -1
  55. package/dist/src/Interfaces/TestingCapabilities.js +0 -3
  56. package/dist/src/Interfaces/TestingCapabilities.js.map +0 -1
  57. package/dist/src/Interfaces/Wiki.js +0 -3
  58. package/dist/src/Interfaces/Wiki.js.map +0 -1
  59. package/dist/src/Interfaces/WorkItems.js +0 -3
  60. package/dist/src/Interfaces/WorkItems.js.map +0 -1
  61. package/dist/src/Services/AIAssistedDevelopmentService.js +0 -195
  62. package/dist/src/Services/AIAssistedDevelopmentService.js.map +0 -1
  63. package/dist/src/Services/ArtifactManagementService.js +0 -346
  64. package/dist/src/Services/ArtifactManagementService.js.map +0 -1
  65. package/dist/src/Services/AzureDevOpsService.js +0 -385
  66. package/dist/src/Services/AzureDevOpsService.js.map +0 -1
  67. package/dist/src/Services/BoardsSprintsService.js +0 -339
  68. package/dist/src/Services/BoardsSprintsService.js.map +0 -1
  69. package/dist/src/Services/BuildService.js +0 -405
  70. package/dist/src/Services/BuildService.js.map +0 -1
  71. package/dist/src/Services/DevSecOpsService.js +0 -307
  72. package/dist/src/Services/DevSecOpsService.js.map +0 -1
  73. package/dist/src/Services/EntraAuthHandler.js +0 -337
  74. package/dist/src/Services/EntraAuthHandler.js.map +0 -1
  75. package/dist/src/Services/GitService.js +0 -1595
  76. package/dist/src/Services/GitService.js.map +0 -1
  77. package/dist/src/Services/ProjectService.js +0 -257
  78. package/dist/src/Services/ProjectService.js.map +0 -1
  79. package/dist/src/Services/TestingCapabilitiesService.js +0 -149
  80. package/dist/src/Services/TestingCapabilitiesService.js.map +0 -1
  81. package/dist/src/Services/WikiService.js +0 -90
  82. package/dist/src/Services/WikiService.js.map +0 -1
  83. package/dist/src/Services/WorkItemService.js +0 -885
  84. package/dist/src/Services/WorkItemService.js.map +0 -1
  85. package/dist/src/Tools/AIAssistedDevelopmentTools.js +0 -137
  86. package/dist/src/Tools/AIAssistedDevelopmentTools.js.map +0 -1
  87. package/dist/src/Tools/ArtifactManagementTools.js +0 -140
  88. package/dist/src/Tools/ArtifactManagementTools.js.map +0 -1
  89. package/dist/src/Tools/BoardsSprintsTools.js +0 -338
  90. package/dist/src/Tools/BoardsSprintsTools.js.map +0 -1
  91. package/dist/src/Tools/BuildTools.js +0 -468
  92. package/dist/src/Tools/BuildTools.js.map +0 -1
  93. package/dist/src/Tools/DevSecOpsTools.js +0 -147
  94. package/dist/src/Tools/DevSecOpsTools.js.map +0 -1
  95. package/dist/src/Tools/GitTools.js +0 -1475
  96. package/dist/src/Tools/GitTools.js.map +0 -1
  97. package/dist/src/Tools/ProjectTools.js +0 -360
  98. package/dist/src/Tools/ProjectTools.js.map +0 -1
  99. package/dist/src/Tools/TestingCapabilitiesTools.js +0 -157
  100. package/dist/src/Tools/TestingCapabilitiesTools.js.map +0 -1
  101. package/dist/src/Tools/WikiTools.js +0 -137
  102. package/dist/src/Tools/WikiTools.js.map +0 -1
  103. package/dist/src/Tools/WorkItemTools.js +0 -862
  104. package/dist/src/Tools/WorkItemTools.js.map +0 -1
  105. package/dist/src/config.js +0 -176
  106. package/dist/src/config.js.map +0 -1
  107. package/dist/src/index.js +0 -1716
  108. package/dist/src/index.js.map +0 -1
  109. package/dist/src/utils/formatHelpers.js +0 -257
  110. package/dist/src/utils/formatHelpers.js.map +0 -1
  111. package/dist/src/utils/getClassMethods.js +0 -8
  112. package/dist/src/utils/getClassMethods.js.map +0 -1
  113. package/dist/src/utils/repositoryResolver.js +0 -40
  114. 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":"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"}