@daghis/teamcity-mcp 1.10.5 → 1.10.7

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.
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "1.10.5"
2
+ ".": "1.10.7"
3
3
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.10.7](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.6...teamcity-mcp-v1.10.7) (2025-10-06)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **teamcity:** serialize snapshot dependencies as xml ([#235](https://github.com/Daghis/teamcity-mcp/issues/235)) ([#236](https://github.com/Daghis/teamcity-mcp/issues/236)) ([9cec149](https://github.com/Daghis/teamcity-mcp/commit/9cec14934783f135b408211fefa41ba6a38391c8))
9
+
10
+ ## [1.10.6](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.5...teamcity-mcp-v1.10.6) (2025-10-04)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **runtime:** replace double assertions in client tooling ([#233](https://github.com/Daghis/teamcity-mcp/issues/233)) ([08b19da](https://github.com/Daghis/teamcity-mcp/commit/08b19da78e09b03fd79c50121c4d607c715ec46a))
16
+
3
17
  ## [1.10.5](https://github.com/Daghis/teamcity-mcp/compare/teamcity-mcp-v1.10.4...teamcity-mcp-v1.10.5) (2025-10-04)
4
18
 
5
19
 
package/dist/index.js CHANGED
@@ -2321,6 +2321,12 @@ var JSON_HEADERS2 = {
2321
2321
  Accept: "application/json"
2322
2322
  }
2323
2323
  };
2324
+ var XML_HEADERS = {
2325
+ headers: {
2326
+ "Content-Type": "application/xml",
2327
+ Accept: "application/json"
2328
+ }
2329
+ };
2324
2330
  var JSON_GET_HEADERS2 = {
2325
2331
  headers: {
2326
2332
  Accept: "application/json"
@@ -2382,6 +2388,86 @@ var mergeRecords2 = (base, override) => {
2382
2388
  }
2383
2389
  return merged;
2384
2390
  };
2391
+ var escapeXml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
2392
+ var attributesToString = (attributes) => {
2393
+ const parts = Object.entries(attributes).filter(([, value]) => value !== void 0).map(([key, value]) => `${key}="${escapeXml(value)}"`);
2394
+ return parts.length > 0 ? ` ${parts.join(" ")}` : "";
2395
+ };
2396
+ var propertiesToXml = (properties) => {
2397
+ if (!properties) {
2398
+ return void 0;
2399
+ }
2400
+ const entries = properties.property;
2401
+ const list = Array.isArray(entries) ? entries : entries != null ? [entries] : [];
2402
+ if (list.length === 0) {
2403
+ return void 0;
2404
+ }
2405
+ const nodes = list.filter((item) => item?.name).map((item) => {
2406
+ const name = item?.name ?? "";
2407
+ const value = item?.value != null ? String(item.value) : "";
2408
+ return `<property name="${escapeXml(name)}" value="${escapeXml(value)}"/>`;
2409
+ });
2410
+ if (nodes.length === 0) {
2411
+ return void 0;
2412
+ }
2413
+ return `<properties>${nodes.join("")}</properties>`;
2414
+ };
2415
+ var sourceBuildTypeToXml = (source) => {
2416
+ if (!source || typeof source !== "object") {
2417
+ return void 0;
2418
+ }
2419
+ const { id, name } = source;
2420
+ if (!id) {
2421
+ return void 0;
2422
+ }
2423
+ const attributes = {
2424
+ id,
2425
+ name
2426
+ };
2427
+ return `<source-buildType${attributesToString(attributes)}/>`;
2428
+ };
2429
+ var dependencyToXml = (dependencyType, payload) => {
2430
+ const root = dependencyType === "artifact" ? "artifact-dependency" : "snapshot-dependency";
2431
+ const normalizeTypeAttribute = (value) => {
2432
+ if (!value) {
2433
+ return void 0;
2434
+ }
2435
+ if (dependencyType === "snapshot" && value === "snapshotDependency") {
2436
+ return "snapshot_dependency";
2437
+ }
2438
+ if (dependencyType === "artifact" && value === "artifactDependency") {
2439
+ return "artifact_dependency";
2440
+ }
2441
+ return value;
2442
+ };
2443
+ const attributes = {
2444
+ id: typeof payload.id === "string" && payload.id.trim() !== "" ? payload.id : void 0,
2445
+ name: typeof payload.name === "string" && payload.name.trim() !== "" ? payload.name : void 0,
2446
+ type: typeof payload.type === "string" && payload.type.trim() !== "" ? normalizeTypeAttribute(payload.type) : void 0,
2447
+ disabled: typeof payload.disabled === "boolean" ? payload.disabled ? "true" : "false" : void 0,
2448
+ inherited: typeof payload.inherited === "boolean" ? payload.inherited ? "true" : "false" : void 0
2449
+ };
2450
+ const fragments = [];
2451
+ const sourceBuildTypeXml = sourceBuildTypeToXml(
2452
+ payload["source-buildType"]
2453
+ );
2454
+ if (sourceBuildTypeXml) {
2455
+ fragments.push(sourceBuildTypeXml);
2456
+ }
2457
+ const propertiesXml = propertiesToXml(payload.properties);
2458
+ if (propertiesXml) {
2459
+ fragments.push(propertiesXml);
2460
+ }
2461
+ return `<${root}${attributesToString(attributes)}>${fragments.join("")}</${root}>`;
2462
+ };
2463
+ var prepareArtifactRequest = (payload) => ({
2464
+ body: payload,
2465
+ headers: JSON_HEADERS2
2466
+ });
2467
+ var prepareSnapshotRequest = (payload) => ({
2468
+ body: dependencyToXml("snapshot", payload),
2469
+ headers: XML_HEADERS
2470
+ });
2385
2471
  var BuildDependencyManager = class {
2386
2472
  constructor(client) {
2387
2473
  this.client = client;
@@ -2436,36 +2522,40 @@ var BuildDependencyManager = class {
2436
2522
  }
2437
2523
  async createDependency(dependencyType, buildTypeId, payload) {
2438
2524
  if (dependencyType === "artifact") {
2525
+ const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
2439
2526
  return this.client.modules.buildTypes.addArtifactDependencyToBuildType(
2440
2527
  buildTypeId,
2441
2528
  void 0,
2442
- payload,
2443
- JSON_HEADERS2
2529
+ body2,
2530
+ headers2
2444
2531
  );
2445
2532
  }
2533
+ const { body, headers } = prepareSnapshotRequest(payload);
2446
2534
  return this.client.modules.buildTypes.addSnapshotDependencyToBuildType(
2447
2535
  buildTypeId,
2448
2536
  void 0,
2449
- payload,
2450
- JSON_HEADERS2
2537
+ body,
2538
+ headers
2451
2539
  );
2452
2540
  }
2453
2541
  async replaceDependency(dependencyType, buildTypeId, dependencyId, payload) {
2454
2542
  if (dependencyType === "artifact") {
2543
+ const { body: body2, headers: headers2 } = prepareArtifactRequest(payload);
2455
2544
  return this.client.modules.buildTypes.replaceArtifactDependency(
2456
2545
  buildTypeId,
2457
2546
  dependencyId,
2458
2547
  void 0,
2459
- payload,
2460
- JSON_HEADERS2
2548
+ body2,
2549
+ headers2
2461
2550
  );
2462
2551
  }
2552
+ const { body, headers } = prepareSnapshotRequest(payload);
2463
2553
  return this.client.modules.buildTypes.replaceSnapshotDependency(
2464
2554
  buildTypeId,
2465
2555
  dependencyId,
2466
2556
  void 0,
2467
- payload,
2468
- JSON_HEADERS2
2557
+ body,
2558
+ headers
2469
2559
  );
2470
2560
  }
2471
2561
  async fetchDependency(dependencyType, buildTypeId, dependencyId) {
@@ -37791,6 +37881,12 @@ var Configuration = class {
37791
37881
  };
37792
37882
 
37793
37883
  // src/api-client.ts
37884
+ var extractRetryAfterMilliseconds = (value) => {
37885
+ if (typeof value === "object" && value !== null && typeof value.retryAfter === "number") {
37886
+ return value.retryAfter * 1e3;
37887
+ }
37888
+ return void 0;
37889
+ };
37794
37890
  var TeamCityAPI = class _TeamCityAPI {
37795
37891
  static instance;
37796
37892
  static instanceConfig;
@@ -37857,7 +37953,7 @@ var TeamCityAPI = class _TeamCityAPI {
37857
37953
  retryDelay: (retryCount, error2) => {
37858
37954
  const reqId = error2?.config?.requestId;
37859
37955
  const tcError = TeamCityAPIError.fromAxiosError(error2, reqId);
37860
- const retryAfter2 = typeof tcError.retryAfter === "number" ? tcError.retryAfter * 1e3 : void 0;
37956
+ const retryAfter2 = extractRetryAfterMilliseconds(tcError);
37861
37957
  return retryAfter2 ?? Math.min(1e3 * Math.pow(2, Math.max(0, retryCount - 1)), 8e3);
37862
37958
  },
37863
37959
  retryCondition: (error2) => {
@@ -38700,22 +38796,19 @@ var DEV_TOOLS = [
38700
38796
  buildRequest.properties = propertiesPayload;
38701
38797
  }
38702
38798
  const sendXmlFallback = async (error2) => {
38703
- const escapeXml = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
38704
- const branchPart = branchName ? `<branchName>${escapeXml(branchName)}</branchName>` : "";
38705
- const commentPart = commentText ? `<comment><text>${escapeXml(commentText)}</text></comment>` : "";
38799
+ const escapeXml2 = (value) => value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
38800
+ const branchPart = branchName ? `<branchName>${escapeXml2(branchName)}</branchName>` : "";
38801
+ const commentPart = commentText ? `<comment><text>${escapeXml2(commentText)}</text></comment>` : "";
38706
38802
  const propertiesPart = propertiesPayload ? `<properties>${propertiesPayload.property.map(
38707
- (prop) => `<property name="${escapeXml(prop.name)}" value="${escapeXml(prop.value)}"/>`
38803
+ (prop) => `<property name="${escapeXml2(prop.name)}" value="${escapeXml2(prop.value)}"/>`
38708
38804
  ).join("")}</properties>` : "";
38709
- const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${escapeXml(
38805
+ const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${escapeXml2(
38710
38806
  typed.buildTypeId
38711
38807
  )}"/>${branchPart}${commentPart}${propertiesPart}</build>`;
38712
- const response = await adapter.modules.buildQueue.addBuildToQueue(
38713
- false,
38714
- xml,
38715
- {
38716
- headers: { "Content-Type": "application/xml", Accept: "application/json" }
38717
- }
38718
- );
38808
+ const response = await adapter.http.post("/app/rest/buildQueue", xml, {
38809
+ headers: { "Content-Type": "application/xml", Accept: "application/json" },
38810
+ params: { moveToTop: false }
38811
+ });
38719
38812
  const build = response.data;
38720
38813
  return json({
38721
38814
  success: true,