@achieveai/azuredevops-mcp 1.3.17 → 1.3.19

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 (119) hide show
  1. package/README.md +76 -0
  2. package/dist/Interfaces/Common.js +37 -1
  3. package/dist/Interfaces/Common.js.map +1 -1
  4. package/dist/Services/AzureDevOpsService.js +234 -32
  5. package/dist/Services/AzureDevOpsService.js.map +1 -1
  6. package/dist/Services/BoardsSprintsService.js +111 -13
  7. package/dist/Services/BoardsSprintsService.js.map +1 -1
  8. package/dist/Services/BuildService.js +157 -24
  9. package/dist/Services/BuildService.js.map +1 -1
  10. package/dist/Services/GitService.js +26 -3
  11. package/dist/Services/GitService.js.map +1 -1
  12. package/dist/Services/ProjectService.js +47 -6
  13. package/dist/Services/ProjectService.js.map +1 -1
  14. package/dist/Services/WorkItemService.js +183 -170
  15. package/dist/Services/WorkItemService.js.map +1 -1
  16. package/dist/Tools/BoardsSprintsTools.js +2 -8
  17. package/dist/Tools/BoardsSprintsTools.js.map +1 -1
  18. package/dist/Tools/BuildTools.js +5 -8
  19. package/dist/Tools/BuildTools.js.map +1 -1
  20. package/dist/Tools/GitTools.js +177 -62
  21. package/dist/Tools/GitTools.js.map +1 -1
  22. package/dist/Tools/WorkItemTools.js +110 -172
  23. package/dist/Tools/WorkItemTools.js.map +1 -1
  24. package/dist/index.js +31 -26
  25. package/dist/index.js.map +1 -1
  26. package/dist/utils/apiUsageGuidance.js +336 -0
  27. package/dist/utils/apiUsageGuidance.js.map +1 -0
  28. package/dist/utils/formatHelpers.js +15 -0
  29. package/dist/utils/formatHelpers.js.map +1 -1
  30. package/package.json +3 -3
  31. package/dist/Services/BuildService.project.test.js +0 -91
  32. package/dist/Services/BuildService.project.test.js.map +0 -1
  33. package/dist/Services/GitService.project.test.js +0 -407
  34. package/dist/Services/GitService.project.test.js.map +0 -1
  35. package/dist/package.json +0 -59
  36. package/dist/src/Interfaces/AIAssisted.js +0 -3
  37. package/dist/src/Interfaces/AIAssisted.js.map +0 -1
  38. package/dist/src/Interfaces/ArtifactManagement.js +0 -3
  39. package/dist/src/Interfaces/ArtifactManagement.js.map +0 -1
  40. package/dist/src/Interfaces/AzureDevOps.js +0 -3
  41. package/dist/src/Interfaces/AzureDevOps.js.map +0 -1
  42. package/dist/src/Interfaces/BoardsAndSprints.js +0 -3
  43. package/dist/src/Interfaces/BoardsAndSprints.js.map +0 -1
  44. package/dist/src/Interfaces/CodeAndRepositories.js +0 -3
  45. package/dist/src/Interfaces/CodeAndRepositories.js.map +0 -1
  46. package/dist/src/Interfaces/Common.js +0 -134
  47. package/dist/src/Interfaces/Common.js.map +0 -1
  48. package/dist/src/Interfaces/CostResourceManagement.js +0 -3
  49. package/dist/src/Interfaces/CostResourceManagement.js.map +0 -1
  50. package/dist/src/Interfaces/DevSecOps.js +0 -3
  51. package/dist/src/Interfaces/DevSecOps.js.map +0 -1
  52. package/dist/src/Interfaces/ExternalIntegrations.js +0 -3
  53. package/dist/src/Interfaces/ExternalIntegrations.js.map +0 -1
  54. package/dist/src/Interfaces/HybridCrossPlatform.js +0 -3
  55. package/dist/src/Interfaces/HybridCrossPlatform.js.map +0 -1
  56. package/dist/src/Interfaces/Pipelines.js +0 -3
  57. package/dist/src/Interfaces/Pipelines.js.map +0 -1
  58. package/dist/src/Interfaces/ProjectManagement.js +0 -3
  59. package/dist/src/Interfaces/ProjectManagement.js.map +0 -1
  60. package/dist/src/Interfaces/TestingCapabilities.js +0 -3
  61. package/dist/src/Interfaces/TestingCapabilities.js.map +0 -1
  62. package/dist/src/Interfaces/Wiki.js +0 -3
  63. package/dist/src/Interfaces/Wiki.js.map +0 -1
  64. package/dist/src/Interfaces/WorkItems.js +0 -3
  65. package/dist/src/Interfaces/WorkItems.js.map +0 -1
  66. package/dist/src/Services/AIAssistedDevelopmentService.js +0 -195
  67. package/dist/src/Services/AIAssistedDevelopmentService.js.map +0 -1
  68. package/dist/src/Services/ArtifactManagementService.js +0 -346
  69. package/dist/src/Services/ArtifactManagementService.js.map +0 -1
  70. package/dist/src/Services/AzureDevOpsService.js +0 -385
  71. package/dist/src/Services/AzureDevOpsService.js.map +0 -1
  72. package/dist/src/Services/BoardsSprintsService.js +0 -339
  73. package/dist/src/Services/BoardsSprintsService.js.map +0 -1
  74. package/dist/src/Services/BuildService.js +0 -405
  75. package/dist/src/Services/BuildService.js.map +0 -1
  76. package/dist/src/Services/DevSecOpsService.js +0 -307
  77. package/dist/src/Services/DevSecOpsService.js.map +0 -1
  78. package/dist/src/Services/EntraAuthHandler.js +0 -337
  79. package/dist/src/Services/EntraAuthHandler.js.map +0 -1
  80. package/dist/src/Services/GitService.js +0 -1595
  81. package/dist/src/Services/GitService.js.map +0 -1
  82. package/dist/src/Services/ProjectService.js +0 -257
  83. package/dist/src/Services/ProjectService.js.map +0 -1
  84. package/dist/src/Services/TestingCapabilitiesService.js +0 -149
  85. package/dist/src/Services/TestingCapabilitiesService.js.map +0 -1
  86. package/dist/src/Services/WikiService.js +0 -90
  87. package/dist/src/Services/WikiService.js.map +0 -1
  88. package/dist/src/Services/WorkItemService.js +0 -885
  89. package/dist/src/Services/WorkItemService.js.map +0 -1
  90. package/dist/src/Tools/AIAssistedDevelopmentTools.js +0 -137
  91. package/dist/src/Tools/AIAssistedDevelopmentTools.js.map +0 -1
  92. package/dist/src/Tools/ArtifactManagementTools.js +0 -140
  93. package/dist/src/Tools/ArtifactManagementTools.js.map +0 -1
  94. package/dist/src/Tools/BoardsSprintsTools.js +0 -338
  95. package/dist/src/Tools/BoardsSprintsTools.js.map +0 -1
  96. package/dist/src/Tools/BuildTools.js +0 -468
  97. package/dist/src/Tools/BuildTools.js.map +0 -1
  98. package/dist/src/Tools/DevSecOpsTools.js +0 -147
  99. package/dist/src/Tools/DevSecOpsTools.js.map +0 -1
  100. package/dist/src/Tools/GitTools.js +0 -1475
  101. package/dist/src/Tools/GitTools.js.map +0 -1
  102. package/dist/src/Tools/ProjectTools.js +0 -360
  103. package/dist/src/Tools/ProjectTools.js.map +0 -1
  104. package/dist/src/Tools/TestingCapabilitiesTools.js +0 -157
  105. package/dist/src/Tools/TestingCapabilitiesTools.js.map +0 -1
  106. package/dist/src/Tools/WikiTools.js +0 -137
  107. package/dist/src/Tools/WikiTools.js.map +0 -1
  108. package/dist/src/Tools/WorkItemTools.js +0 -862
  109. package/dist/src/Tools/WorkItemTools.js.map +0 -1
  110. package/dist/src/config.js +0 -176
  111. package/dist/src/config.js.map +0 -1
  112. package/dist/src/index.js +0 -1716
  113. package/dist/src/index.js.map +0 -1
  114. package/dist/src/utils/formatHelpers.js +0 -257
  115. package/dist/src/utils/formatHelpers.js.map +0 -1
  116. package/dist/src/utils/getClassMethods.js +0 -8
  117. package/dist/src/utils/getClassMethods.js.map +0 -1
  118. package/dist/src/utils/repositoryResolver.js +0 -40
  119. package/dist/src/utils/repositoryResolver.js.map +0 -1
package/README.md CHANGED
@@ -161,6 +161,82 @@ Could not find repository "my-repo" in project "MyProject".
161
161
 
162
162
  Set `ENABLE_STRUCTURED_CONTENT=true` to include machine-readable JSON in the `structuredContent` field alongside the markdown `content`. This is useful for programmatic consumers that need typed data while still having a human-readable fallback.
163
163
 
164
+ For performance-sensitive tools, the raw and structured payload now also includes an `apiUsage` object that reports:
165
+ - relative Azure DevOps cost (`low`, `medium`, `high`, `very-high`)
166
+ - estimated Azure DevOps API round-trips for the specific call shape
167
+ - best-practice guidance and lower-cost alternatives
168
+ - WIQL authoring advice for query tools
169
+
170
+ Exact Azure DevOps TSTU usage is not exposed by a deterministic formula. The server therefore reports relative cost and estimated round-trips, not a fake exact TSTU number.
171
+
172
+ ## Performance Guidance
173
+
174
+ Azure DevOps rate limits are enforced using throughput units over a sliding 5-minute window. Query cost varies with organization size, returned ID count, requested fields, and whether you are using expensive operators like `CONTAINS`, `EVER`, `WAS EVER`, or link queries.
175
+
176
+ Prefer these patterns:
177
+ - Use `listWorkItems` for structured discovery with exact filters.
178
+ - Use `getQueryResults` for recurring team queries that already exist as saved queries.
179
+ - Use `getRecentlyUpdatedWorkItems` or `getMyWorkItems` for bounded slices instead of broad project scans.
180
+ - Use `getWorkItemsBatch` after you already know the IDs you care about.
181
+ - Request only the fields you actually need.
182
+ - Honor `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`, and `X-RateLimit-Delay` when present.
183
+
184
+ Avoid these patterns unless they are genuinely required:
185
+ - `CONTAINS` or `CONTAINS WORDS` for routine listing.
186
+ - `EVER` or `WAS EVER` for normal current-state queries.
187
+ - Unbounded queries with no `ChangedDate` or `CreatedDate` filter.
188
+ - Large `top` values paired with large field lists.
189
+ - Repeating sprint/build context lookups in tight loops.
190
+
191
+ ### Performance-First WIQL Patterns
192
+
193
+ Use exact filters and bounded date windows instead of substring search.
194
+
195
+ ```sql
196
+ SELECT [System.Id]
197
+ FROM WorkItems
198
+ WHERE
199
+ [System.TeamProject] = @project
200
+ AND [System.WorkItemType] = 'Bug'
201
+ AND [System.State] IN ('New', 'Active', 'Resolved')
202
+ AND [System.ChangedDate] >= @Today - 30
203
+ ORDER BY [System.ChangedDate] DESC
204
+ ```
205
+
206
+ ```sql
207
+ SELECT [System.Id]
208
+ FROM WorkItems
209
+ WHERE
210
+ [System.TeamProject] = @project
211
+ AND [System.AreaPath] UNDER 'Contoso\\Platform'
212
+ AND [System.State] <> 'Closed'
213
+ AND [System.ChangedDate] >= @Today - 14
214
+ ORDER BY [System.ChangedDate] DESC
215
+ ```
216
+
217
+ ```sql
218
+ SELECT [System.Id]
219
+ FROM WorkItems
220
+ WHERE
221
+ [System.TeamProject] = @project
222
+ AND [System.AssignedTo] = @Me
223
+ AND [System.IterationPath] = @CurrentIteration('[Contoso]\\Web')
224
+ AND [System.State] <> 'Closed'
225
+ ORDER BY [System.ChangedDate] DESC
226
+ ```
227
+
228
+ Avoid this as a default listing pattern:
229
+
230
+ ```sql
231
+ SELECT [System.Id]
232
+ FROM WorkItems
233
+ WHERE
234
+ [System.TeamProject] = @project
235
+ AND [System.Title] CONTAINS 'login'
236
+ ```
237
+
238
+ Use free-text search only as a fallback discovery step, then rewrite the generated WIQL into exact fielded filters.
239
+
164
240
  ## Installation
165
241
 
166
242
  ### Quick Start (npm)
@@ -5,6 +5,32 @@ exports.setErrorContext = setErrorContext;
5
5
  exports.formatErrorResponse = formatErrorResponse;
6
6
  const config_1 = require("../config");
7
7
  const child_process_1 = require("child_process");
8
+ function buildApiUsageBanner(apiUsage) {
9
+ if (!apiUsage) {
10
+ return '';
11
+ }
12
+ const estimatedCalls = apiUsage.estimatedAdoCalls;
13
+ const bestPractices = Array.isArray(apiUsage.bestPractices) ? apiUsage.bestPractices.slice(0, 3) : [];
14
+ const avoid = Array.isArray(apiUsage.avoid) ? apiUsage.avoid.slice(0, 2) : [];
15
+ const alternatives = Array.isArray(apiUsage.recommendedAlternativeTools)
16
+ ? apiUsage.recommendedAlternativeTools.slice(0, 3)
17
+ : [];
18
+ let banner = `Usage profile: **${apiUsage.relativeCost || 'unknown'}** relative Azure DevOps cost`;
19
+ if (typeof estimatedCalls === 'number') {
20
+ banner += `, about **${estimatedCalls}** API call${estimatedCalls === 1 ? '' : 's'}`;
21
+ }
22
+ banner += `. ${apiUsage.tstuGuidance || ''}`;
23
+ if (bestPractices.length > 0) {
24
+ banner += `\n\nBest use:\n- ${bestPractices.join('\n- ')}`;
25
+ }
26
+ if (avoid.length > 0) {
27
+ banner += `\n\nAvoid when possible:\n- ${avoid.join('\n- ')}`;
28
+ }
29
+ if (alternatives.length > 0) {
30
+ banner += `\n\nBetter alternatives for some cases:\n- ${alternatives.join('\n- ')}`;
31
+ }
32
+ return `${banner}\n\n---\n\n`;
33
+ }
8
34
  /**
9
35
  * Formats a response for MCP compatibility
10
36
  * @param data The data to format
@@ -17,9 +43,14 @@ function formatMcpResponse(data, message, isError = false, includeStructuredCont
17
43
  // When a message is provided, use it as the sole content (markdown-formatted tools)
18
44
  // Only fall back to JSON dump when no message is provided at all
19
45
  const hasMessage = message && message.length > 0;
46
+ const throttleInfo = data?.throttleInfo;
47
+ const apiUsageBanner = buildApiUsageBanner(data?.apiUsage);
48
+ const throttleBanner = throttleInfo?.throttled
49
+ ? `Warning: Azure DevOps throttled this operation. Waited ${(throttleInfo.totalWaitMs / 1000).toFixed(1)}s across ${throttleInfo.retryCount} retr${throttleInfo.retryCount === 1 ? 'y' : 'ies'} before continuing. This usually means too many requests are being sent in a short period.\n\n---\n\n`
50
+ : '';
20
51
  const response = {
21
52
  content: hasMessage
22
- ? [{ type: "text", text: message }]
53
+ ? [{ type: "text", text: `${throttleBanner}${apiUsageBanner}${message}` }]
23
54
  : [
24
55
  { type: "text", text: isError ? "Error occurred" : "Request successful" },
25
56
  { type: "text", text: typeof data === 'string' ? data : JSON.stringify(data, null, 2) }
@@ -81,7 +112,12 @@ function setErrorContext(context) {
81
112
  function formatErrorResponse(error) {
82
113
  const errorMessage = error instanceof Error ? error.message : String(error);
83
114
  let md = `Error: ${errorMessage}`;
115
+ const throttleInfo = error?.throttleInfo;
84
116
  const lower = errorMessage.toLowerCase();
117
+ if (throttleInfo?.throttled || error?.statusCode === 429 || lower.includes('too many requests') || lower.includes('rate limit') || lower.includes('throttle')) {
118
+ const totalWait = throttleInfo?.totalWaitMs ? `${(throttleInfo.totalWaitMs / 1000).toFixed(1)}s` : 'a retry window';
119
+ md += `\n\n**Azure DevOps is throttling requests.** The server waited for ${totalWait} before giving up. This indicates too many requests are being sent in a short period.`;
120
+ }
85
121
  // Auth error hints
86
122
  const statusCode = error?.statusCode || error?.status;
87
123
  if (statusCode === 401 || statusCode === 403 || lower.includes('unauthorized') || lower.includes('authentication failed')) {
@@ -1 +1 @@
1
- {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../src/Interfaces/Common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Common.js","sourceRoot":"","sources":["../../src/Interfaces/Common.ts"],"names":[],"mappings":"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"}
@@ -35,11 +35,26 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.AzureDevOpsService = void 0;
37
37
  const azdev = __importStar(require("azure-devops-node-api"));
38
+ const fs = __importStar(require("fs"));
39
+ const os = __importStar(require("os"));
40
+ const path = __importStar(require("path"));
38
41
  const WebApi_1 = require("azure-devops-node-api/WebApi");
39
42
  const EntraAuthHandler_1 = require("./EntraAuthHandler");
40
43
  const repositoryResolver_1 = require("../utils/repositoryResolver");
44
+ const PACKAGE_VERSION = (() => {
45
+ try {
46
+ const packageJsonPath = path.resolve(__dirname, "../../package.json");
47
+ const packageJsonContent = fs.readFileSync(packageJsonPath, "utf8");
48
+ const packageJson = JSON.parse(packageJsonContent);
49
+ return packageJson.version || "0.0.0";
50
+ }
51
+ catch {
52
+ return "0.0.0";
53
+ }
54
+ })();
41
55
  class AzureDevOpsService {
42
56
  constructor(config) {
57
+ this.throttleNotices = [];
43
58
  this.config = config;
44
59
  // Get the appropriate authentication handler
45
60
  const tokenCredentialAuthTypes = ["entra", "azcli", "interactive"];
@@ -96,9 +111,22 @@ class AzureDevOpsService {
96
111
  }
97
112
  // Create options for the WebApi
98
113
  const requestOptions = {};
114
+ const hostName = os.hostname().replace(/[^A-Za-z0-9._-]/g, '_');
115
+ let userName = 'unknown-user';
116
+ try {
117
+ userName = os.userInfo().username.replace(/[^A-Za-z0-9._-]/g, '_');
118
+ }
119
+ catch {
120
+ // Best effort only; keep the client traceable even if user info is unavailable.
121
+ }
122
+ const userAgent = `azuredevops-mcp/${PACKAGE_VERSION} (${hostName}; ${userName})`;
123
+ requestOptions.headers = {
124
+ 'User-Agent': userAgent,
125
+ };
99
126
  // For on-premises with API version specification, we'll add it to request headers
100
127
  if (config.isOnPremises && config.apiVersion) {
101
128
  requestOptions.headers = {
129
+ ...requestOptions.headers,
102
130
  Accept: `application/json;api-version=${config.apiVersion}`,
103
131
  };
104
132
  }
@@ -117,46 +145,201 @@ class AzureDevOpsService {
117
145
  * Catches auth errors (401/403) at the service layer even if the HTTP-level
118
146
  * retry in TokenCredentialAuthHandler didn't fire (e.g. SDK swallowed it).
119
147
  */
120
- async withAuthRetry(operation) {
121
- try {
122
- return await operation();
123
- }
124
- catch (error) {
125
- const statusCode = error?.statusCode || error?.status;
126
- const message = (error?.message || '').toLowerCase();
127
- const isAuthError = statusCode === 401 || statusCode === 403
128
- || message.includes('unauthorized') || message.includes('authentication failed');
129
- if (isAuthError && this.authHandler instanceof EntraAuthHandler_1.TokenCredentialAuthHandler) {
130
- console.error(`[Auth] Service-layer auth retry: refreshing token...`);
131
- await this.authHandler.forceRefresh();
148
+ async withAuthRetry(operation, context, throttleAccumulator) {
149
+ let authRetried = false;
150
+ let throttleRetried = 0;
151
+ const contextLabel = this.formatRetryContext(context);
152
+ const notices = throttleAccumulator ?? this.throttleNotices;
153
+ while (true) {
154
+ try {
132
155
  return await operation();
133
156
  }
134
- throw error;
157
+ catch (error) {
158
+ const statusCode = error?.statusCode || error?.status;
159
+ const message = (error?.message || '').toLowerCase();
160
+ const isAuthError = statusCode === 401 || statusCode === 403
161
+ || message.includes('unauthorized') || message.includes('authentication failed');
162
+ if (isAuthError && !authRetried && this.authHandler instanceof EntraAuthHandler_1.TokenCredentialAuthHandler) {
163
+ authRetried = true;
164
+ console.error(`[Auth] Service-layer auth retry: refreshing token${contextLabel ? ` for ${contextLabel}` : ''}...`);
165
+ await this.authHandler.forceRefresh();
166
+ continue;
167
+ }
168
+ const throttleInfo = this.getThrottleInfo(error);
169
+ if (throttleInfo && throttleRetried < 2) {
170
+ throttleRetried += 1;
171
+ notices.push({
172
+ ...throttleInfo,
173
+ observedAt: new Date().toISOString(),
174
+ });
175
+ console.error(`[Throttle] Azure DevOps throttled request${contextLabel ? ` for ${contextLabel}` : ''}. Waiting ${throttleInfo.waitMs}ms before retry ${throttleRetried}.`);
176
+ await this.sleep(throttleInfo.waitMs);
177
+ continue;
178
+ }
179
+ if (throttleInfo) {
180
+ error.throttleInfo = {
181
+ throttled: true,
182
+ retryCount: throttleRetried,
183
+ totalWaitMs: notices.reduce((sum, notice) => sum + notice.waitMs, 0),
184
+ notices: [...notices, { ...throttleInfo, observedAt: new Date().toISOString() }],
185
+ context,
186
+ };
187
+ }
188
+ throw error;
189
+ }
190
+ }
191
+ }
192
+ static buildThrottleInfo(notices) {
193
+ if (notices.length === 0) {
194
+ return undefined;
195
+ }
196
+ return {
197
+ throttled: true,
198
+ retryCount: notices.length,
199
+ totalWaitMs: notices.reduce((sum, notice) => sum + notice.waitMs, 0),
200
+ notices,
201
+ };
202
+ }
203
+ drainThrottleInfo() {
204
+ if (this.throttleNotices.length === 0) {
205
+ return undefined;
135
206
  }
207
+ const notices = [...this.throttleNotices];
208
+ this.throttleNotices = [];
209
+ return AzureDevOpsService.buildThrottleInfo(notices);
210
+ }
211
+ async sleep(waitMs) {
212
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
213
+ }
214
+ getThrottleInfo(error) {
215
+ const statusCode = error?.statusCode || error?.status;
216
+ const message = String(error?.message || '').toLowerCase();
217
+ const isThrottle = statusCode === 429
218
+ || message.includes('rate limit')
219
+ || message.includes('too many requests')
220
+ || message.includes('throttle');
221
+ if (!isThrottle) {
222
+ return undefined;
223
+ }
224
+ const headers = error?.response?.headers || error?.headers || error?.result?.headers || error?.response?.message?.headers;
225
+ const retryAfter = this.getHeaderValue(headers, 'retry-after');
226
+ const rateLimitDelay = this.getHeaderValue(headers, 'x-ratelimit-delay');
227
+ let waitMs = 15000;
228
+ let reason = 'Azure DevOps is throttling requests.';
229
+ if (retryAfter) {
230
+ const retryAfterSeconds = Number(retryAfter);
231
+ if (!Number.isNaN(retryAfterSeconds)) {
232
+ waitMs = Math.max(1, Math.ceil(retryAfterSeconds)) * 1000;
233
+ }
234
+ else {
235
+ const retryDate = Date.parse(retryAfter);
236
+ if (!Number.isNaN(retryDate)) {
237
+ waitMs = Math.max(1000, retryDate - Date.now());
238
+ }
239
+ }
240
+ reason = `Azure DevOps requested a retry after ${retryAfter}.`;
241
+ }
242
+ else if (rateLimitDelay) {
243
+ const delaySeconds = Number(rateLimitDelay);
244
+ if (!Number.isNaN(delaySeconds)) {
245
+ waitMs = Math.max(1, Math.ceil(delaySeconds)) * 1000;
246
+ }
247
+ reason = `Azure DevOps returned X-RateLimit-Delay=${rateLimitDelay}.`;
248
+ }
249
+ return {
250
+ waitMs,
251
+ statusCode,
252
+ reason,
253
+ };
254
+ }
255
+ getHeaderValue(headers, name) {
256
+ if (!headers) {
257
+ return undefined;
258
+ }
259
+ if (typeof headers.get === 'function') {
260
+ return headers.get(name) || headers.get(name.toLowerCase()) || undefined;
261
+ }
262
+ if (Array.isArray(headers)) {
263
+ const match = headers.find((entry) => Array.isArray(entry) && String(entry[0]).toLowerCase() === name.toLowerCase());
264
+ return match ? String(match[1]) : undefined;
265
+ }
266
+ if (typeof headers === 'object') {
267
+ const key = Object.keys(headers).find((headerName) => headerName.toLowerCase() === name.toLowerCase());
268
+ if (key) {
269
+ const value = headers[key];
270
+ return Array.isArray(value) ? String(value[0]) : String(value);
271
+ }
272
+ }
273
+ return undefined;
274
+ }
275
+ formatRetryContext(context) {
276
+ if (!context?.operationName) {
277
+ return '';
278
+ }
279
+ const details = context.details
280
+ ? Object.entries(context.details)
281
+ .filter(([, value]) => value !== undefined)
282
+ .map(([key, value]) => `${key}=${value}`)
283
+ .join(', ')
284
+ : '';
285
+ return details ? `${context.operationName} (${details})` : context.operationName;
286
+ }
287
+ getRequestedFields(fields, defaults) {
288
+ const selected = fields && fields.length > 0 ? fields : (defaults || AzureDevOpsService.BASE_SUMMARY_FIELDS);
289
+ return Array.from(new Set(selected));
290
+ }
291
+ transformSummaryWorkItem(workItem) {
292
+ const fields = workItem.fields || {};
293
+ return {
294
+ id: workItem.id,
295
+ url: workItem.url,
296
+ title: fields['System.Title'],
297
+ teamProject: fields['System.TeamProject'],
298
+ workItemType: fields['System.WorkItemType'],
299
+ state: fields['System.State'],
300
+ assignedTo: fields['System.AssignedTo'] ? {
301
+ displayName: fields['System.AssignedTo'].displayName,
302
+ uniqueName: fields['System.AssignedTo'].uniqueName,
303
+ } : null,
304
+ createdBy: fields['System.CreatedBy'] ? {
305
+ displayName: fields['System.CreatedBy'].displayName,
306
+ uniqueName: fields['System.CreatedBy'].uniqueName,
307
+ } : null,
308
+ createdDate: fields['System.CreatedDate'],
309
+ changedDate: fields['System.ChangedDate'],
310
+ areaPath: fields['System.AreaPath'],
311
+ iterationPath: fields['System.IterationPath'],
312
+ priority: fields['Microsoft.VSTS.Common.Priority'],
313
+ originalEstimate: fields['Microsoft.VSTS.Scheduling.OriginalEstimate'],
314
+ completedWork: fields['Microsoft.VSTS.Scheduling.CompletedWork'],
315
+ remainingWork: fields['Microsoft.VSTS.Scheduling.RemainingWork'],
316
+ fields,
317
+ };
136
318
  }
137
319
  /**
138
- * List work items based on a WIQL query
320
+ * Batch-fetch work item details for an array of refs (IDs or relation objects).
321
+ * Handles the ADO 200-ID-per-call limit automatically.
139
322
  */
140
- async listWorkItems(wiqlQuery, top) {
141
- try {
142
- const witApi = await this.getWorkItemTrackingApi();
143
- const serverTop = top ?? 200;
144
- // Execute the WIQL query with server-side top limit
145
- const queryResult = await witApi.queryByWiql({
146
- query: wiqlQuery,
147
- }, {
148
- project: this.config.project,
149
- }, undefined, serverTop);
150
- // Return the work items
151
- return {
152
- workItems: queryResult.workItems || [],
153
- count: queryResult.workItems?.length || 0,
154
- };
323
+ async hydrateWorkItemRefs(refs, options) {
324
+ const extractId = options?.extractId ?? ((ref) => ref?.id);
325
+ const project = options?.project ?? this.config.project;
326
+ const operationName = options?.operationName ?? 'batchHydrate';
327
+ const ids = (refs || [])
328
+ .map(extractId)
329
+ .filter((id) => typeof id === 'number');
330
+ if (ids.length === 0) {
331
+ return [];
155
332
  }
156
- catch (error) {
157
- console.error("Error listing work items:", error);
158
- throw error;
333
+ const witApi = await this.getWorkItemTrackingApi();
334
+ const requestedFields = this.getRequestedFields(options?.fields, options?.defaults);
335
+ const BATCH_SIZE = 200;
336
+ const allWorkItems = [];
337
+ for (let i = 0; i < ids.length; i += BATCH_SIZE) {
338
+ const batch = ids.slice(i, i + BATCH_SIZE);
339
+ const batchResult = await this.withAuthRetry(() => witApi.getWorkItems(batch, requestedFields, undefined, undefined, undefined, project), { operationName, details: { project, ids: batch.length, fields: requestedFields.length } }, options?.throttleAccumulator);
340
+ allWorkItems.push(...(batchResult || []));
159
341
  }
342
+ return allWorkItems.map((workItem) => this.transformSummaryWorkItem(workItem));
160
343
  }
161
344
  /**
162
345
  * Get the authenticated user's ID, cached after first resolution.
@@ -189,4 +372,23 @@ class AzureDevOpsService {
189
372
  }
190
373
  }
191
374
  exports.AzureDevOpsService = AzureDevOpsService;
375
+ AzureDevOpsService.BASE_SUMMARY_FIELDS = [
376
+ 'System.Id',
377
+ 'System.Title',
378
+ 'System.TeamProject',
379
+ 'System.WorkItemType',
380
+ 'System.State',
381
+ 'System.AssignedTo',
382
+ 'System.CreatedBy',
383
+ 'System.CreatedDate',
384
+ 'System.ChangedDate',
385
+ 'System.AreaPath',
386
+ 'System.IterationPath',
387
+ 'Microsoft.VSTS.Common.Priority',
388
+ ];
389
+ AzureDevOpsService.SCHEDULING_FIELDS = [
390
+ 'Microsoft.VSTS.Scheduling.OriginalEstimate',
391
+ 'Microsoft.VSTS.Scheduling.CompletedWork',
392
+ 'Microsoft.VSTS.Scheduling.RemainingWork',
393
+ ];
192
394
  //# sourceMappingURL=AzureDevOpsService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AzureDevOpsService.js","sourceRoot":"","sources":["../../src/Services/AzureDevOpsService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AzureDevOpsService.js","sourceRoot":"","sources":["../../src/Services/AzureDevOpsService.ts"],"names":[],"mappings":"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"}