@daghis/teamcity-mcp 0.9.1 → 1.0.0

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 (1133) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +9 -7
  3. package/dist/index.js +1707 -16779
  4. package/dist/index.js.map +4 -4
  5. package/package.json +1 -1
  6. package/.commitlintrc.mjs +0 -25
  7. package/.eslintignore +0 -16
  8. package/.eslintrc.js +0 -166
  9. package/.github/dependabot.yml +0 -38
  10. package/.github/settings.yml +0 -7
  11. package/.github/workflows/ci.yml +0 -115
  12. package/.github/workflows/codeql.yml +0 -35
  13. package/.github/workflows/commitlint.yml +0 -20
  14. package/.github/workflows/publish.yml +0 -67
  15. package/.github/workflows/release-please.yml +0 -21
  16. package/.nvmrc +0 -1
  17. package/.prettierignore +0 -22
  18. package/.prettierrc +0 -28
  19. package/AGENTS.md +0 -129
  20. package/ARCHITECTURE.md +0 -66
  21. package/CONTRIBUTING.md +0 -68
  22. package/dist/src/api-client.d.ts +0 -51
  23. package/dist/src/api-client.d.ts.map +0 -1
  24. package/dist/src/config/index.d.ts +0 -41
  25. package/dist/src/config/index.d.ts.map +0 -1
  26. package/dist/src/errors/index.d.ts +0 -2
  27. package/dist/src/errors/index.d.ts.map +0 -1
  28. package/dist/src/formatters/build-step-formatter.d.ts +0 -5
  29. package/dist/src/formatters/build-step-formatter.d.ts.map +0 -1
  30. package/dist/src/formatters/trigger-formatter.d.ts +0 -4
  31. package/dist/src/formatters/trigger-formatter.d.ts.map +0 -1
  32. package/dist/src/index.d.ts +0 -2
  33. package/dist/src/index.d.ts.map +0 -1
  34. package/dist/src/middleware/error.d.ts +0 -56
  35. package/dist/src/middleware/error.d.ts.map +0 -1
  36. package/dist/src/middleware/global-error-handler.d.ts +0 -22
  37. package/dist/src/middleware/global-error-handler.d.ts.map +0 -1
  38. package/dist/src/middleware/index.d.ts +0 -2
  39. package/dist/src/middleware/index.d.ts.map +0 -1
  40. package/dist/src/server.d.ts +0 -4
  41. package/dist/src/server.d.ts.map +0 -1
  42. package/dist/src/swagger/index.d.ts +0 -43
  43. package/dist/src/swagger/index.d.ts.map +0 -1
  44. package/dist/src/swagger/swagger-cache.d.ts +0 -23
  45. package/dist/src/swagger/swagger-cache.d.ts.map +0 -1
  46. package/dist/src/swagger/swagger-fetcher.d.ts +0 -24
  47. package/dist/src/swagger/swagger-fetcher.d.ts.map +0 -1
  48. package/dist/src/swagger/swagger-validator.d.ts +0 -17
  49. package/dist/src/swagger/swagger-validator.d.ts.map +0 -1
  50. package/dist/src/teamcity/api-types.d.ts +0 -224
  51. package/dist/src/teamcity/api-types.d.ts.map +0 -1
  52. package/dist/src/teamcity/artifact-manager.d.ts +0 -52
  53. package/dist/src/teamcity/artifact-manager.d.ts.map +0 -1
  54. package/dist/src/teamcity/auth.d.ts +0 -22
  55. package/dist/src/teamcity/auth.d.ts.map +0 -1
  56. package/dist/src/teamcity/branch-discovery-manager.d.ts +0 -39
  57. package/dist/src/teamcity/branch-discovery-manager.d.ts.map +0 -1
  58. package/dist/src/teamcity/branch-filtering-service.d.ts +0 -62
  59. package/dist/src/teamcity/branch-filtering-service.d.ts.map +0 -1
  60. package/dist/src/teamcity/branch-specification-parser.d.ts +0 -33
  61. package/dist/src/teamcity/branch-specification-parser.d.ts.map +0 -1
  62. package/dist/src/teamcity/build-config-manager.d.ts +0 -75
  63. package/dist/src/teamcity/build-config-manager.d.ts.map +0 -1
  64. package/dist/src/teamcity/build-config-navigator.d.ts +0 -89
  65. package/dist/src/teamcity/build-config-navigator.d.ts.map +0 -1
  66. package/dist/src/teamcity/build-configuration-clone-manager.d.ts +0 -49
  67. package/dist/src/teamcity/build-configuration-clone-manager.d.ts.map +0 -1
  68. package/dist/src/teamcity/build-configuration-manager.d.ts +0 -82
  69. package/dist/src/teamcity/build-configuration-manager.d.ts.map +0 -1
  70. package/dist/src/teamcity/build-configuration-resolver.d.ts +0 -95
  71. package/dist/src/teamcity/build-configuration-resolver.d.ts.map +0 -1
  72. package/dist/src/teamcity/build-configuration-update-manager.d.ts +0 -76
  73. package/dist/src/teamcity/build-configuration-update-manager.d.ts.map +0 -1
  74. package/dist/src/teamcity/build-list-manager.d.ts +0 -62
  75. package/dist/src/teamcity/build-list-manager.d.ts.map +0 -1
  76. package/dist/src/teamcity/build-parameters-manager.d.ts +0 -143
  77. package/dist/src/teamcity/build-parameters-manager.d.ts.map +0 -1
  78. package/dist/src/teamcity/build-progress-tracker.d.ts +0 -49
  79. package/dist/src/teamcity/build-progress-tracker.d.ts.map +0 -1
  80. package/dist/src/teamcity/build-query-builder.d.ts +0 -27
  81. package/dist/src/teamcity/build-query-builder.d.ts.map +0 -1
  82. package/dist/src/teamcity/build-queue-manager.d.ts +0 -102
  83. package/dist/src/teamcity/build-queue-manager.d.ts.map +0 -1
  84. package/dist/src/teamcity/build-results-manager.d.ts +0 -87
  85. package/dist/src/teamcity/build-results-manager.d.ts.map +0 -1
  86. package/dist/src/teamcity/build-status-manager.d.ts +0 -65
  87. package/dist/src/teamcity/build-status-manager.d.ts.map +0 -1
  88. package/dist/src/teamcity/build-step-manager.d.ts +0 -65
  89. package/dist/src/teamcity/build-step-manager.d.ts.map +0 -1
  90. package/dist/src/teamcity/build-trigger-manager.d.ts +0 -108
  91. package/dist/src/teamcity/build-trigger-manager.d.ts.map +0 -1
  92. package/dist/src/teamcity/circuit-breaker.d.ts +0 -47
  93. package/dist/src/teamcity/circuit-breaker.d.ts.map +0 -1
  94. package/dist/src/teamcity/client-adapter.d.ts +0 -12
  95. package/dist/src/teamcity/client-adapter.d.ts.map +0 -1
  96. package/dist/src/teamcity/client.d.ts +0 -49
  97. package/dist/src/teamcity/client.d.ts.map +0 -1
  98. package/dist/src/teamcity/config.d.ts +0 -41
  99. package/dist/src/teamcity/config.d.ts.map +0 -1
  100. package/dist/src/teamcity/configuration-branch-matcher.d.ts +0 -37
  101. package/dist/src/teamcity/configuration-branch-matcher.d.ts.map +0 -1
  102. package/dist/src/teamcity/errors.d.ts +0 -79
  103. package/dist/src/teamcity/errors.d.ts.map +0 -1
  104. package/dist/src/teamcity/index.d.ts +0 -48
  105. package/dist/src/teamcity/index.d.ts.map +0 -1
  106. package/dist/src/teamcity/pagination.d.ts +0 -32
  107. package/dist/src/teamcity/pagination.d.ts.map +0 -1
  108. package/dist/src/teamcity/project-list-manager.d.ts +0 -19
  109. package/dist/src/teamcity/project-list-manager.d.ts.map +0 -1
  110. package/dist/src/teamcity/project-manager.d.ts +0 -73
  111. package/dist/src/teamcity/project-manager.d.ts.map +0 -1
  112. package/dist/src/teamcity/project-navigator.d.ts +0 -100
  113. package/dist/src/teamcity/project-navigator.d.ts.map +0 -1
  114. package/dist/src/teamcity/test-problem-reporter.d.ts +0 -60
  115. package/dist/src/teamcity/test-problem-reporter.d.ts.map +0 -1
  116. package/dist/src/teamcity/types/api-responses.d.ts +0 -235
  117. package/dist/src/teamcity/types/api-responses.d.ts.map +0 -1
  118. package/dist/src/teamcity-client/api/agent-api.d.ts +0 -97
  119. package/dist/src/teamcity-client/api/agent-api.d.ts.map +0 -1
  120. package/dist/src/teamcity-client/api/agent-pool-api.d.ts +0 -92
  121. package/dist/src/teamcity-client/api/agent-pool-api.d.ts.map +0 -1
  122. package/dist/src/teamcity-client/api/agent-type-api.d.ts +0 -20
  123. package/dist/src/teamcity-client/api/agent-type-api.d.ts.map +0 -1
  124. package/dist/src/teamcity-client/api/audit-api.d.ts +0 -26
  125. package/dist/src/teamcity-client/api/audit-api.d.ts.map +0 -1
  126. package/dist/src/teamcity-client/api/avatar-api.d.ts +0 -34
  127. package/dist/src/teamcity-client/api/avatar-api.d.ts.map +0 -1
  128. package/dist/src/teamcity-client/api/build-api.d.ts +0 -315
  129. package/dist/src/teamcity-client/api/build-api.d.ts.map +0 -1
  130. package/dist/src/teamcity-client/api/build-queue-api.d.ts +0 -90
  131. package/dist/src/teamcity-client/api/build-queue-api.d.ts.map +0 -1
  132. package/dist/src/teamcity-client/api/build-type-api.d.ts +0 -585
  133. package/dist/src/teamcity-client/api/build-type-api.d.ts.map +0 -1
  134. package/dist/src/teamcity-client/api/change-api.d.ts +0 -71
  135. package/dist/src/teamcity-client/api/change-api.d.ts.map +0 -1
  136. package/dist/src/teamcity-client/api/cloud-instance-api.d.ts +0 -70
  137. package/dist/src/teamcity-client/api/cloud-instance-api.d.ts.map +0 -1
  138. package/dist/src/teamcity-client/api/deployment-dashboard-api.d.ts +0 -64
  139. package/dist/src/teamcity-client/api/deployment-dashboard-api.d.ts.map +0 -1
  140. package/dist/src/teamcity-client/api/global-server-settings-api.d.ts +0 -25
  141. package/dist/src/teamcity-client/api/global-server-settings-api.d.ts.map +0 -1
  142. package/dist/src/teamcity-client/api/group-api.d.ts +0 -99
  143. package/dist/src/teamcity-client/api/group-api.d.ts.map +0 -1
  144. package/dist/src/teamcity-client/api/health-api.d.ts +0 -38
  145. package/dist/src/teamcity-client/api/health-api.d.ts.map +0 -1
  146. package/dist/src/teamcity-client/api/investigation-api.d.ts +0 -46
  147. package/dist/src/teamcity-client/api/investigation-api.d.ts.map +0 -1
  148. package/dist/src/teamcity-client/api/mute-api.d.ts +0 -46
  149. package/dist/src/teamcity-client/api/mute-api.d.ts.map +0 -1
  150. package/dist/src/teamcity-client/api/node-api.d.ts +0 -49
  151. package/dist/src/teamcity-client/api/node-api.d.ts.map +0 -1
  152. package/dist/src/teamcity-client/api/problem-api.d.ts +0 -26
  153. package/dist/src/teamcity-client/api/problem-api.d.ts.map +0 -1
  154. package/dist/src/teamcity-client/api/problem-occurrence-api.d.ts +0 -26
  155. package/dist/src/teamcity-client/api/problem-occurrence-api.d.ts.map +0 -1
  156. package/dist/src/teamcity-client/api/project-api.d.ts +0 -271
  157. package/dist/src/teamcity-client/api/project-api.d.ts.map +0 -1
  158. package/dist/src/teamcity-client/api/role-api.d.ts +0 -56
  159. package/dist/src/teamcity-client/api/role-api.d.ts.map +0 -1
  160. package/dist/src/teamcity-client/api/root-api.d.ts +0 -35
  161. package/dist/src/teamcity-client/api/root-api.d.ts.map +0 -1
  162. package/dist/src/teamcity-client/api/server-api.d.ts +0 -112
  163. package/dist/src/teamcity-client/api/server-api.d.ts.map +0 -1
  164. package/dist/src/teamcity-client/api/server-authentication-settings-api.d.ts +0 -25
  165. package/dist/src/teamcity-client/api/server-authentication-settings-api.d.ts.map +0 -1
  166. package/dist/src/teamcity-client/api/test-api.d.ts +0 -26
  167. package/dist/src/teamcity-client/api/test-api.d.ts.map +0 -1
  168. package/dist/src/teamcity-client/api/test-occurrence-api.d.ts +0 -26
  169. package/dist/src/teamcity-client/api/test-occurrence-api.d.ts.map +0 -1
  170. package/dist/src/teamcity-client/api/user-api.d.ts +0 -164
  171. package/dist/src/teamcity-client/api/user-api.d.ts.map +0 -1
  172. package/dist/src/teamcity-client/api/vcs-root-api.d.ts +0 -88
  173. package/dist/src/teamcity-client/api/vcs-root-api.d.ts.map +0 -1
  174. package/dist/src/teamcity-client/api/vcs-root-instance-api.d.ts +0 -104
  175. package/dist/src/teamcity-client/api/vcs-root-instance-api.d.ts.map +0 -1
  176. package/dist/src/teamcity-client/api/versioned-settings-api.d.ts +0 -94
  177. package/dist/src/teamcity-client/api/versioned-settings-api.d.ts.map +0 -1
  178. package/dist/src/teamcity-client/api.d.ts +0 -31
  179. package/dist/src/teamcity-client/api.d.ts.map +0 -1
  180. package/dist/src/teamcity-client/base.d.ts +0 -32
  181. package/dist/src/teamcity-client/base.d.ts.map +0 -1
  182. package/dist/src/teamcity-client/common.d.ts +0 -14
  183. package/dist/src/teamcity-client/common.d.ts.map +0 -1
  184. package/dist/src/teamcity-client/configuration.d.ts +0 -23
  185. package/dist/src/teamcity-client/configuration.d.ts.map +0 -1
  186. package/dist/src/teamcity-client/index.d.ts +0 -4
  187. package/dist/src/teamcity-client/index.d.ts.map +0 -1
  188. package/dist/src/teamcity-client/models/agent-locator.d.ts +0 -34
  189. package/dist/src/teamcity-client/models/agent-locator.d.ts.map +0 -1
  190. package/dist/src/teamcity-client/models/agent-pool-locator.d.ts +0 -10
  191. package/dist/src/teamcity-client/models/agent-pool-locator.d.ts.map +0 -1
  192. package/dist/src/teamcity-client/models/agent-pool.d.ts +0 -16
  193. package/dist/src/teamcity-client/models/agent-pool.d.ts.map +0 -1
  194. package/dist/src/teamcity-client/models/agent-pools.d.ts +0 -9
  195. package/dist/src/teamcity-client/models/agent-pools.d.ts.map +0 -1
  196. package/dist/src/teamcity-client/models/agent-requirement.d.ts +0 -11
  197. package/dist/src/teamcity-client/models/agent-requirement.d.ts.map +0 -1
  198. package/dist/src/teamcity-client/models/agent-requirements.d.ts +0 -6
  199. package/dist/src/teamcity-client/models/agent-requirements.d.ts.map +0 -1
  200. package/dist/src/teamcity-client/models/agent-type-locator.d.ts +0 -8
  201. package/dist/src/teamcity-client/models/agent-type-locator.d.ts.map +0 -1
  202. package/dist/src/teamcity-client/models/agent-type.d.ts +0 -14
  203. package/dist/src/teamcity-client/models/agent-type.d.ts.map +0 -1
  204. package/dist/src/teamcity-client/models/agent-types.d.ts +0 -9
  205. package/dist/src/teamcity-client/models/agent-types.d.ts.map +0 -1
  206. package/dist/src/teamcity-client/models/agent.d.ts +0 -59
  207. package/dist/src/teamcity-client/models/agent.d.ts.map +0 -1
  208. package/dist/src/teamcity-client/models/agents.d.ts +0 -9
  209. package/dist/src/teamcity-client/models/agents.d.ts.map +0 -1
  210. package/dist/src/teamcity-client/models/approvable-build.d.ts +0 -6
  211. package/dist/src/teamcity-client/models/approvable-build.d.ts.map +0 -1
  212. package/dist/src/teamcity-client/models/approval-info.d.ts +0 -24
  213. package/dist/src/teamcity-client/models/approval-info.d.ts.map +0 -1
  214. package/dist/src/teamcity-client/models/artifact-dependencies.d.ts +0 -7
  215. package/dist/src/teamcity-client/models/artifact-dependencies.d.ts.map +0 -1
  216. package/dist/src/teamcity-client/models/artifact-dependency.d.ts +0 -13
  217. package/dist/src/teamcity-client/models/artifact-dependency.d.ts.map +0 -1
  218. package/dist/src/teamcity-client/models/artifact-download-info.d.ts +0 -5
  219. package/dist/src/teamcity-client/models/artifact-download-info.d.ts.map +0 -1
  220. package/dist/src/teamcity-client/models/audit-action.d.ts +0 -6
  221. package/dist/src/teamcity-client/models/audit-action.d.ts.map +0 -1
  222. package/dist/src/teamcity-client/models/audit-event.d.ts +0 -12
  223. package/dist/src/teamcity-client/models/audit-event.d.ts.map +0 -1
  224. package/dist/src/teamcity-client/models/audit-events.d.ts +0 -9
  225. package/dist/src/teamcity-client/models/audit-events.d.ts.map +0 -1
  226. package/dist/src/teamcity-client/models/audit-locator.d.ts +0 -245
  227. package/dist/src/teamcity-client/models/audit-locator.d.ts.map +0 -1
  228. package/dist/src/teamcity-client/models/auth-module.d.ts +0 -6
  229. package/dist/src/teamcity-client/models/auth-module.d.ts.map +0 -1
  230. package/dist/src/teamcity-client/models/auth-modules.d.ts +0 -5
  231. package/dist/src/teamcity-client/models/auth-modules.d.ts.map +0 -1
  232. package/dist/src/teamcity-client/models/authorization-tokens-requirements.d.ts +0 -5
  233. package/dist/src/teamcity-client/models/authorization-tokens-requirements.d.ts.map +0 -1
  234. package/dist/src/teamcity-client/models/authorized-info.d.ts +0 -6
  235. package/dist/src/teamcity-client/models/authorized-info.d.ts.map +0 -1
  236. package/dist/src/teamcity-client/models/branch-locator.d.ts +0 -40
  237. package/dist/src/teamcity-client/models/branch-locator.d.ts.map +0 -1
  238. package/dist/src/teamcity-client/models/branch-version.d.ts +0 -13
  239. package/dist/src/teamcity-client/models/branch-version.d.ts.map +0 -1
  240. package/dist/src/teamcity-client/models/branch.d.ts +0 -12
  241. package/dist/src/teamcity-client/models/branch.d.ts.map +0 -1
  242. package/dist/src/teamcity-client/models/branches.d.ts +0 -7
  243. package/dist/src/teamcity-client/models/branches.d.ts.map +0 -1
  244. package/dist/src/teamcity-client/models/build-cancel-request.d.ts +0 -5
  245. package/dist/src/teamcity-client/models/build-cancel-request.d.ts.map +0 -1
  246. package/dist/src/teamcity-client/models/build-change.d.ts +0 -6
  247. package/dist/src/teamcity-client/models/build-change.d.ts.map +0 -1
  248. package/dist/src/teamcity-client/models/build-changes.d.ts +0 -6
  249. package/dist/src/teamcity-client/models/build-changes.d.ts.map +0 -1
  250. package/dist/src/teamcity-client/models/build-executor.d.ts +0 -4
  251. package/dist/src/teamcity-client/models/build-executor.d.ts.map +0 -1
  252. package/dist/src/teamcity-client/models/build-locator.d.ts +0 -69
  253. package/dist/src/teamcity-client/models/build-locator.d.ts.map +0 -1
  254. package/dist/src/teamcity-client/models/build-queue-locator.d.ts +0 -14
  255. package/dist/src/teamcity-client/models/build-queue-locator.d.ts.map +0 -1
  256. package/dist/src/teamcity-client/models/build-status-update.d.ts +0 -5
  257. package/dist/src/teamcity-client/models/build-status-update.d.ts.map +0 -1
  258. package/dist/src/teamcity-client/models/build-trigger-customization.d.ts +0 -7
  259. package/dist/src/teamcity-client/models/build-trigger-customization.d.ts.map +0 -1
  260. package/dist/src/teamcity-client/models/build-triggering-options.d.ts +0 -12
  261. package/dist/src/teamcity-client/models/build-triggering-options.d.ts.map +0 -1
  262. package/dist/src/teamcity-client/models/build-type-locator.d.ts +0 -18
  263. package/dist/src/teamcity-client/models/build-type-locator.d.ts.map +0 -1
  264. package/dist/src/teamcity-client/models/build-type.d.ts +0 -64
  265. package/dist/src/teamcity-client/models/build-type.d.ts.map +0 -1
  266. package/dist/src/teamcity-client/models/build-types.d.ts +0 -9
  267. package/dist/src/teamcity-client/models/build-types.d.ts.map +0 -1
  268. package/dist/src/teamcity-client/models/build.d.ts +0 -127
  269. package/dist/src/teamcity-client/models/build.d.ts.map +0 -1
  270. package/dist/src/teamcity-client/models/builds-with-reason.d.ts +0 -6
  271. package/dist/src/teamcity-client/models/builds-with-reason.d.ts.map +0 -1
  272. package/dist/src/teamcity-client/models/builds.d.ts +0 -9
  273. package/dist/src/teamcity-client/models/builds.d.ts.map +0 -1
  274. package/dist/src/teamcity-client/models/change-locator.d.ts +0 -21
  275. package/dist/src/teamcity-client/models/change-locator.d.ts.map +0 -1
  276. package/dist/src/teamcity-client/models/change-status.d.ts +0 -19
  277. package/dist/src/teamcity-client/models/change-status.d.ts.map +0 -1
  278. package/dist/src/teamcity-client/models/change.d.ts +0 -35
  279. package/dist/src/teamcity-client/models/change.d.ts.map +0 -1
  280. package/dist/src/teamcity-client/models/changes.d.ts +0 -9
  281. package/dist/src/teamcity-client/models/changes.d.ts.map +0 -1
  282. package/dist/src/teamcity-client/models/cleanup.d.ts +0 -9
  283. package/dist/src/teamcity-client/models/cleanup.d.ts.map +0 -1
  284. package/dist/src/teamcity-client/models/cloud-error.d.ts +0 -5
  285. package/dist/src/teamcity-client/models/cloud-error.d.ts.map +0 -1
  286. package/dist/src/teamcity-client/models/cloud-image-locator.d.ts +0 -17
  287. package/dist/src/teamcity-client/models/cloud-image-locator.d.ts.map +0 -1
  288. package/dist/src/teamcity-client/models/cloud-image.d.ts +0 -18
  289. package/dist/src/teamcity-client/models/cloud-image.d.ts.map +0 -1
  290. package/dist/src/teamcity-client/models/cloud-images.d.ts +0 -9
  291. package/dist/src/teamcity-client/models/cloud-images.d.ts.map +0 -1
  292. package/dist/src/teamcity-client/models/cloud-instance-locator.d.ts +0 -13
  293. package/dist/src/teamcity-client/models/cloud-instance-locator.d.ts.map +0 -1
  294. package/dist/src/teamcity-client/models/cloud-instance.d.ts +0 -16
  295. package/dist/src/teamcity-client/models/cloud-instance.d.ts.map +0 -1
  296. package/dist/src/teamcity-client/models/cloud-instances.d.ts +0 -9
  297. package/dist/src/teamcity-client/models/cloud-instances.d.ts.map +0 -1
  298. package/dist/src/teamcity-client/models/cloud-profile-locator.d.ts +0 -13
  299. package/dist/src/teamcity-client/models/cloud-profile-locator.d.ts.map +0 -1
  300. package/dist/src/teamcity-client/models/cloud-profile.d.ts +0 -13
  301. package/dist/src/teamcity-client/models/cloud-profile.d.ts.map +0 -1
  302. package/dist/src/teamcity-client/models/cloud-profiles.d.ts +0 -9
  303. package/dist/src/teamcity-client/models/cloud-profiles.d.ts.map +0 -1
  304. package/dist/src/teamcity-client/models/comment.d.ts +0 -7
  305. package/dist/src/teamcity-client/models/comment.d.ts.map +0 -1
  306. package/dist/src/teamcity-client/models/commiter.d.ts +0 -6
  307. package/dist/src/teamcity-client/models/commiter.d.ts.map +0 -1
  308. package/dist/src/teamcity-client/models/compatibilities.d.ts +0 -6
  309. package/dist/src/teamcity-client/models/compatibilities.d.ts.map +0 -1
  310. package/dist/src/teamcity-client/models/compatibility-policy.d.ts +0 -6
  311. package/dist/src/teamcity-client/models/compatibility-policy.d.ts.map +0 -1
  312. package/dist/src/teamcity-client/models/compatibility.d.ts +0 -10
  313. package/dist/src/teamcity-client/models/compatibility.d.ts.map +0 -1
  314. package/dist/src/teamcity-client/models/composite-approval-rule.d.ts +0 -10
  315. package/dist/src/teamcity-client/models/composite-approval-rule.d.ts.map +0 -1
  316. package/dist/src/teamcity-client/models/composite-approvals.d.ts +0 -6
  317. package/dist/src/teamcity-client/models/composite-approvals.d.ts.map +0 -1
  318. package/dist/src/teamcity-client/models/cron.d.ts +0 -8
  319. package/dist/src/teamcity-client/models/cron.d.ts.map +0 -1
  320. package/dist/src/teamcity-client/models/customizations.d.ts +0 -15
  321. package/dist/src/teamcity-client/models/customizations.d.ts.map +0 -1
  322. package/dist/src/teamcity-client/models/daily.d.ts +0 -5
  323. package/dist/src/teamcity-client/models/daily.d.ts.map +0 -1
  324. package/dist/src/teamcity-client/models/datas.d.ts +0 -6
  325. package/dist/src/teamcity-client/models/datas.d.ts.map +0 -1
  326. package/dist/src/teamcity-client/models/deployment-dashboard-locator.d.ts +0 -9
  327. package/dist/src/teamcity-client/models/deployment-dashboard-locator.d.ts.map +0 -1
  328. package/dist/src/teamcity-client/models/deployment-dashboard.d.ts +0 -9
  329. package/dist/src/teamcity-client/models/deployment-dashboard.d.ts.map +0 -1
  330. package/dist/src/teamcity-client/models/deployment-dashboards.d.ts +0 -9
  331. package/dist/src/teamcity-client/models/deployment-dashboards.d.ts.map +0 -1
  332. package/dist/src/teamcity-client/models/deployment-history.d.ts +0 -6
  333. package/dist/src/teamcity-client/models/deployment-history.d.ts.map +0 -1
  334. package/dist/src/teamcity-client/models/deployment-instance-locator.d.ts +0 -16
  335. package/dist/src/teamcity-client/models/deployment-instance-locator.d.ts.map +0 -1
  336. package/dist/src/teamcity-client/models/deployment-instance.d.ts +0 -20
  337. package/dist/src/teamcity-client/models/deployment-instance.d.ts.map +0 -1
  338. package/dist/src/teamcity-client/models/deployment-instances.d.ts +0 -9
  339. package/dist/src/teamcity-client/models/deployment-instances.d.ts.map +0 -1
  340. package/dist/src/teamcity-client/models/deployment-state-entries.d.ts +0 -8
  341. package/dist/src/teamcity-client/models/deployment-state-entries.d.ts.map +0 -1
  342. package/dist/src/teamcity-client/models/deployment-state-entry.d.ts +0 -16
  343. package/dist/src/teamcity-client/models/deployment-state-entry.d.ts.map +0 -1
  344. package/dist/src/teamcity-client/models/disabled-responsibilities.d.ts +0 -6
  345. package/dist/src/teamcity-client/models/disabled-responsibilities.d.ts.map +0 -1
  346. package/dist/src/teamcity-client/models/download-info.d.ts +0 -8
  347. package/dist/src/teamcity-client/models/download-info.d.ts.map +0 -1
  348. package/dist/src/teamcity-client/models/downloaded-artifacts.d.ts +0 -7
  349. package/dist/src/teamcity-client/models/downloaded-artifacts.d.ts.map +0 -1
  350. package/dist/src/teamcity-client/models/effective-responsibilities.d.ts +0 -6
  351. package/dist/src/teamcity-client/models/effective-responsibilities.d.ts.map +0 -1
  352. package/dist/src/teamcity-client/models/enabled-info.d.ts +0 -7
  353. package/dist/src/teamcity-client/models/enabled-info.d.ts.map +0 -1
  354. package/dist/src/teamcity-client/models/enabled-responsibilities.d.ts +0 -6
  355. package/dist/src/teamcity-client/models/enabled-responsibilities.d.ts.map +0 -1
  356. package/dist/src/teamcity-client/models/entries.d.ts +0 -6
  357. package/dist/src/teamcity-client/models/entries.d.ts.map +0 -1
  358. package/dist/src/teamcity-client/models/entry.d.ts +0 -5
  359. package/dist/src/teamcity-client/models/entry.d.ts.map +0 -1
  360. package/dist/src/teamcity-client/models/environment.d.ts +0 -5
  361. package/dist/src/teamcity-client/models/environment.d.ts.map +0 -1
  362. package/dist/src/teamcity-client/models/feature.d.ts +0 -11
  363. package/dist/src/teamcity-client/models/feature.d.ts.map +0 -1
  364. package/dist/src/teamcity-client/models/features.d.ts +0 -6
  365. package/dist/src/teamcity-client/models/features.d.ts.map +0 -1
  366. package/dist/src/teamcity-client/models/file-change.d.ts +0 -10
  367. package/dist/src/teamcity-client/models/file-change.d.ts.map +0 -1
  368. package/dist/src/teamcity-client/models/file-changes.d.ts +0 -6
  369. package/dist/src/teamcity-client/models/file-changes.d.ts.map +0 -1
  370. package/dist/src/teamcity-client/models/files.d.ts +0 -6
  371. package/dist/src/teamcity-client/models/files.d.ts.map +0 -1
  372. package/dist/src/teamcity-client/models/group-approval-rule.d.ts +0 -8
  373. package/dist/src/teamcity-client/models/group-approval-rule.d.ts.map +0 -1
  374. package/dist/src/teamcity-client/models/group-approvals.d.ts +0 -6
  375. package/dist/src/teamcity-client/models/group-approvals.d.ts.map +0 -1
  376. package/dist/src/teamcity-client/models/group.d.ts +0 -16
  377. package/dist/src/teamcity-client/models/group.d.ts.map +0 -1
  378. package/dist/src/teamcity-client/models/groups.d.ts +0 -6
  379. package/dist/src/teamcity-client/models/groups.d.ts.map +0 -1
  380. package/dist/src/teamcity-client/models/health-categories.d.ts +0 -9
  381. package/dist/src/teamcity-client/models/health-categories.d.ts.map +0 -1
  382. package/dist/src/teamcity-client/models/health-category.d.ts +0 -7
  383. package/dist/src/teamcity-client/models/health-category.d.ts.map +0 -1
  384. package/dist/src/teamcity-client/models/health-item.d.ts +0 -13
  385. package/dist/src/teamcity-client/models/health-item.d.ts.map +0 -1
  386. package/dist/src/teamcity-client/models/health-status-items.d.ts +0 -9
  387. package/dist/src/teamcity-client/models/health-status-items.d.ts.map +0 -1
  388. package/dist/src/teamcity-client/models/href.d.ts +0 -4
  389. package/dist/src/teamcity-client/models/href.d.ts.map +0 -1
  390. package/dist/src/teamcity-client/models/index.d.ts +0 -230
  391. package/dist/src/teamcity-client/models/index.d.ts.map +0 -1
  392. package/dist/src/teamcity-client/models/investigation-locator.d.ts +0 -35
  393. package/dist/src/teamcity-client/models/investigation-locator.d.ts.map +0 -1
  394. package/dist/src/teamcity-client/models/investigation.d.ts +0 -24
  395. package/dist/src/teamcity-client/models/investigation.d.ts.map +0 -1
  396. package/dist/src/teamcity-client/models/investigations.d.ts +0 -9
  397. package/dist/src/teamcity-client/models/investigations.d.ts.map +0 -1
  398. package/dist/src/teamcity-client/models/issue-usage.d.ts +0 -7
  399. package/dist/src/teamcity-client/models/issue-usage.d.ts.map +0 -1
  400. package/dist/src/teamcity-client/models/issue.d.ts +0 -5
  401. package/dist/src/teamcity-client/models/issue.d.ts.map +0 -1
  402. package/dist/src/teamcity-client/models/issues-usages.d.ts +0 -7
  403. package/dist/src/teamcity-client/models/issues-usages.d.ts.map +0 -1
  404. package/dist/src/teamcity-client/models/issues.d.ts +0 -5
  405. package/dist/src/teamcity-client/models/issues.d.ts.map +0 -1
  406. package/dist/src/teamcity-client/models/items.d.ts +0 -4
  407. package/dist/src/teamcity-client/models/items.d.ts.map +0 -1
  408. package/dist/src/teamcity-client/models/labeled-value.d.ts +0 -5
  409. package/dist/src/teamcity-client/models/labeled-value.d.ts.map +0 -1
  410. package/dist/src/teamcity-client/models/license-key.d.ts +0 -29
  411. package/dist/src/teamcity-client/models/license-key.d.ts.map +0 -1
  412. package/dist/src/teamcity-client/models/license-keys.d.ts +0 -7
  413. package/dist/src/teamcity-client/models/license-keys.d.ts.map +0 -1
  414. package/dist/src/teamcity-client/models/licensing-data.d.ts +0 -26
  415. package/dist/src/teamcity-client/models/licensing-data.d.ts.map +0 -1
  416. package/dist/src/teamcity-client/models/link.d.ts +0 -6
  417. package/dist/src/teamcity-client/models/link.d.ts.map +0 -1
  418. package/dist/src/teamcity-client/models/links.d.ts +0 -6
  419. package/dist/src/teamcity-client/models/links.d.ts.map +0 -1
  420. package/dist/src/teamcity-client/models/matrix-build-feature-descriptor.d.ts +0 -8
  421. package/dist/src/teamcity-client/models/matrix-build-feature-descriptor.d.ts.map +0 -1
  422. package/dist/src/teamcity-client/models/matrix-configuration.d.ts +0 -9
  423. package/dist/src/teamcity-client/models/matrix-configuration.d.ts.map +0 -1
  424. package/dist/src/teamcity-client/models/matrix-dependencies.d.ts +0 -6
  425. package/dist/src/teamcity-client/models/matrix-dependencies.d.ts.map +0 -1
  426. package/dist/src/teamcity-client/models/matrix-dependency.d.ts +0 -7
  427. package/dist/src/teamcity-client/models/matrix-dependency.d.ts.map +0 -1
  428. package/dist/src/teamcity-client/models/matrix-parameter-descriptor.d.ts +0 -7
  429. package/dist/src/teamcity-client/models/matrix-parameter-descriptor.d.ts.map +0 -1
  430. package/dist/src/teamcity-client/models/meta-data.d.ts +0 -6
  431. package/dist/src/teamcity-client/models/meta-data.d.ts.map +0 -1
  432. package/dist/src/teamcity-client/models/metric-tag.d.ts +0 -5
  433. package/dist/src/teamcity-client/models/metric-tag.d.ts.map +0 -1
  434. package/dist/src/teamcity-client/models/metric-tags.d.ts +0 -6
  435. package/dist/src/teamcity-client/models/metric-tags.d.ts.map +0 -1
  436. package/dist/src/teamcity-client/models/metric-value.d.ts +0 -7
  437. package/dist/src/teamcity-client/models/metric-value.d.ts.map +0 -1
  438. package/dist/src/teamcity-client/models/metric-values.d.ts +0 -6
  439. package/dist/src/teamcity-client/models/metric-values.d.ts.map +0 -1
  440. package/dist/src/teamcity-client/models/metric.d.ts +0 -10
  441. package/dist/src/teamcity-client/models/metric.d.ts.map +0 -1
  442. package/dist/src/teamcity-client/models/metrics.d.ts +0 -6
  443. package/dist/src/teamcity-client/models/metrics.d.ts.map +0 -1
  444. package/dist/src/teamcity-client/models/model-file.d.ts +0 -13
  445. package/dist/src/teamcity-client/models/model-file.d.ts.map +0 -1
  446. package/dist/src/teamcity-client/models/multiple-operation-result.d.ts +0 -7
  447. package/dist/src/teamcity-client/models/multiple-operation-result.d.ts.map +0 -1
  448. package/dist/src/teamcity-client/models/mute-locator.d.ts +0 -26
  449. package/dist/src/teamcity-client/models/mute-locator.d.ts.map +0 -1
  450. package/dist/src/teamcity-client/models/mute.d.ts +0 -13
  451. package/dist/src/teamcity-client/models/mute.d.ts.map +0 -1
  452. package/dist/src/teamcity-client/models/mutes.d.ts +0 -9
  453. package/dist/src/teamcity-client/models/mutes.d.ts.map +0 -1
  454. package/dist/src/teamcity-client/models/new-build-type-description.d.ts +0 -13
  455. package/dist/src/teamcity-client/models/new-build-type-description.d.ts.map +0 -1
  456. package/dist/src/teamcity-client/models/new-project-description.d.ts +0 -15
  457. package/dist/src/teamcity-client/models/new-project-description.d.ts.map +0 -1
  458. package/dist/src/teamcity-client/models/node.d.ts +0 -21
  459. package/dist/src/teamcity-client/models/node.d.ts.map +0 -1
  460. package/dist/src/teamcity-client/models/nodes.d.ts +0 -6
  461. package/dist/src/teamcity-client/models/nodes.d.ts.map +0 -1
  462. package/dist/src/teamcity-client/models/operation-result.d.ts +0 -6
  463. package/dist/src/teamcity-client/models/operation-result.d.ts.map +0 -1
  464. package/dist/src/teamcity-client/models/parsed-test-name.d.ts +0 -10
  465. package/dist/src/teamcity-client/models/parsed-test-name.d.ts.map +0 -1
  466. package/dist/src/teamcity-client/models/permission-assignment.d.ts +0 -8
  467. package/dist/src/teamcity-client/models/permission-assignment.d.ts.map +0 -1
  468. package/dist/src/teamcity-client/models/permission-assignments.d.ts +0 -6
  469. package/dist/src/teamcity-client/models/permission-assignments.d.ts.map +0 -1
  470. package/dist/src/teamcity-client/models/permission-restriction.d.ts +0 -8
  471. package/dist/src/teamcity-client/models/permission-restriction.d.ts.map +0 -1
  472. package/dist/src/teamcity-client/models/permission-restrictions.d.ts +0 -6
  473. package/dist/src/teamcity-client/models/permission-restrictions.d.ts.map +0 -1
  474. package/dist/src/teamcity-client/models/permission.d.ts +0 -6
  475. package/dist/src/teamcity-client/models/permission.d.ts.map +0 -1
  476. package/dist/src/teamcity-client/models/permissions.d.ts +0 -6
  477. package/dist/src/teamcity-client/models/permissions.d.ts.map +0 -1
  478. package/dist/src/teamcity-client/models/pin-info.d.ts +0 -6
  479. package/dist/src/teamcity-client/models/pin-info.d.ts.map +0 -1
  480. package/dist/src/teamcity-client/models/plugin.d.ts +0 -9
  481. package/dist/src/teamcity-client/models/plugin.d.ts.map +0 -1
  482. package/dist/src/teamcity-client/models/plugins.d.ts +0 -6
  483. package/dist/src/teamcity-client/models/plugins.d.ts.map +0 -1
  484. package/dist/src/teamcity-client/models/problem-locator.d.ts +0 -15
  485. package/dist/src/teamcity-client/models/problem-locator.d.ts.map +0 -1
  486. package/dist/src/teamcity-client/models/problem-occurrence-locator.d.ts +0 -16
  487. package/dist/src/teamcity-client/models/problem-occurrence-locator.d.ts.map +0 -1
  488. package/dist/src/teamcity-client/models/problem-occurrence.d.ts +0 -20
  489. package/dist/src/teamcity-client/models/problem-occurrence.d.ts.map +0 -1
  490. package/dist/src/teamcity-client/models/problem-occurrences.d.ts +0 -14
  491. package/dist/src/teamcity-client/models/problem-occurrences.d.ts.map +0 -1
  492. package/dist/src/teamcity-client/models/problem-scope.d.ts +0 -9
  493. package/dist/src/teamcity-client/models/problem-scope.d.ts.map +0 -1
  494. package/dist/src/teamcity-client/models/problem-target.d.ts +0 -8
  495. package/dist/src/teamcity-client/models/problem-target.d.ts.map +0 -1
  496. package/dist/src/teamcity-client/models/problem.d.ts +0 -15
  497. package/dist/src/teamcity-client/models/problem.d.ts.map +0 -1
  498. package/dist/src/teamcity-client/models/problems.d.ts +0 -8
  499. package/dist/src/teamcity-client/models/problems.d.ts.map +0 -1
  500. package/dist/src/teamcity-client/models/progress-info.d.ts +0 -13
  501. package/dist/src/teamcity-client/models/progress-info.d.ts.map +0 -1
  502. package/dist/src/teamcity-client/models/project-feature.d.ts +0 -11
  503. package/dist/src/teamcity-client/models/project-feature.d.ts.map +0 -1
  504. package/dist/src/teamcity-client/models/project-features.d.ts +0 -7
  505. package/dist/src/teamcity-client/models/project-features.d.ts.map +0 -1
  506. package/dist/src/teamcity-client/models/project-locator.d.ts +0 -20
  507. package/dist/src/teamcity-client/models/project-locator.d.ts.map +0 -1
  508. package/dist/src/teamcity-client/models/project.d.ts +0 -39
  509. package/dist/src/teamcity-client/models/project.d.ts.map +0 -1
  510. package/dist/src/teamcity-client/models/projects.d.ts +0 -9
  511. package/dist/src/teamcity-client/models/projects.d.ts.map +0 -1
  512. package/dist/src/teamcity-client/models/properties.d.ts +0 -7
  513. package/dist/src/teamcity-client/models/properties.d.ts.map +0 -1
  514. package/dist/src/teamcity-client/models/property.d.ts +0 -8
  515. package/dist/src/teamcity-client/models/property.d.ts.map +0 -1
  516. package/dist/src/teamcity-client/models/related-entities.d.ts +0 -6
  517. package/dist/src/teamcity-client/models/related-entities.d.ts.map +0 -1
  518. package/dist/src/teamcity-client/models/related-entity.d.ts +0 -29
  519. package/dist/src/teamcity-client/models/related-entity.d.ts.map +0 -1
  520. package/dist/src/teamcity-client/models/related.d.ts +0 -5
  521. package/dist/src/teamcity-client/models/related.d.ts.map +0 -1
  522. package/dist/src/teamcity-client/models/repository-state.d.ts +0 -7
  523. package/dist/src/teamcity-client/models/repository-state.d.ts.map +0 -1
  524. package/dist/src/teamcity-client/models/requirements.d.ts +0 -4
  525. package/dist/src/teamcity-client/models/requirements.d.ts.map +0 -1
  526. package/dist/src/teamcity-client/models/resolution.d.ts +0 -11
  527. package/dist/src/teamcity-client/models/resolution.d.ts.map +0 -1
  528. package/dist/src/teamcity-client/models/responsibility.d.ts +0 -5
  529. package/dist/src/teamcity-client/models/responsibility.d.ts.map +0 -1
  530. package/dist/src/teamcity-client/models/revision.d.ts +0 -9
  531. package/dist/src/teamcity-client/models/revision.d.ts.map +0 -1
  532. package/dist/src/teamcity-client/models/revisions.d.ts +0 -7
  533. package/dist/src/teamcity-client/models/revisions.d.ts.map +0 -1
  534. package/dist/src/teamcity-client/models/role.d.ts +0 -6
  535. package/dist/src/teamcity-client/models/role.d.ts.map +0 -1
  536. package/dist/src/teamcity-client/models/roles.d.ts +0 -5
  537. package/dist/src/teamcity-client/models/roles.d.ts.map +0 -1
  538. package/dist/src/teamcity-client/models/server-auth-settings.d.ts +0 -12
  539. package/dist/src/teamcity-client/models/server-auth-settings.d.ts.map +0 -1
  540. package/dist/src/teamcity-client/models/server-global-settings.d.ts +0 -15
  541. package/dist/src/teamcity-client/models/server-global-settings.d.ts.map +0 -1
  542. package/dist/src/teamcity-client/models/server.d.ts +0 -26
  543. package/dist/src/teamcity-client/models/server.d.ts.map +0 -1
  544. package/dist/src/teamcity-client/models/snapshot-dependencies.d.ts +0 -6
  545. package/dist/src/teamcity-client/models/snapshot-dependencies.d.ts.map +0 -1
  546. package/dist/src/teamcity-client/models/snapshot-dependency-link.d.ts +0 -8
  547. package/dist/src/teamcity-client/models/snapshot-dependency-link.d.ts.map +0 -1
  548. package/dist/src/teamcity-client/models/snapshot-dependency.d.ts +0 -13
  549. package/dist/src/teamcity-client/models/snapshot-dependency.d.ts.map +0 -1
  550. package/dist/src/teamcity-client/models/state-field.d.ts +0 -5
  551. package/dist/src/teamcity-client/models/state-field.d.ts.map +0 -1
  552. package/dist/src/teamcity-client/models/step.d.ts +0 -12
  553. package/dist/src/teamcity-client/models/step.d.ts.map +0 -1
  554. package/dist/src/teamcity-client/models/steps.d.ts +0 -6
  555. package/dist/src/teamcity-client/models/steps.d.ts.map +0 -1
  556. package/dist/src/teamcity-client/models/tag-locator.d.ts +0 -6
  557. package/dist/src/teamcity-client/models/tag-locator.d.ts.map +0 -1
  558. package/dist/src/teamcity-client/models/tag.d.ts +0 -7
  559. package/dist/src/teamcity-client/models/tag.d.ts.map +0 -1
  560. package/dist/src/teamcity-client/models/tags.d.ts +0 -6
  561. package/dist/src/teamcity-client/models/tags.d.ts.map +0 -1
  562. package/dist/src/teamcity-client/models/team-city-node-locator.d.ts +0 -6
  563. package/dist/src/teamcity-client/models/team-city-node-locator.d.ts.map +0 -1
  564. package/dist/src/teamcity-client/models/test-counters.d.ts +0 -10
  565. package/dist/src/teamcity-client/models/test-counters.d.ts.map +0 -1
  566. package/dist/src/teamcity-client/models/test-locator.d.ts +0 -14
  567. package/dist/src/teamcity-client/models/test-locator.d.ts.map +0 -1
  568. package/dist/src/teamcity-client/models/test-occurrence-locator.d.ts +0 -31
  569. package/dist/src/teamcity-client/models/test-occurrence-locator.d.ts.map +0 -1
  570. package/dist/src/teamcity-client/models/test-occurrence.d.ts +0 -37
  571. package/dist/src/teamcity-client/models/test-occurrence.d.ts.map +0 -1
  572. package/dist/src/teamcity-client/models/test-occurrences.d.ts +0 -16
  573. package/dist/src/teamcity-client/models/test-occurrences.d.ts.map +0 -1
  574. package/dist/src/teamcity-client/models/test-run-metadata.d.ts +0 -6
  575. package/dist/src/teamcity-client/models/test-run-metadata.d.ts.map +0 -1
  576. package/dist/src/teamcity-client/models/tests.d.ts +0 -10
  577. package/dist/src/teamcity-client/models/tests.d.ts.map +0 -1
  578. package/dist/src/teamcity-client/models/token.d.ts +0 -9
  579. package/dist/src/teamcity-client/models/token.d.ts.map +0 -1
  580. package/dist/src/teamcity-client/models/tokens.d.ts +0 -6
  581. package/dist/src/teamcity-client/models/tokens.d.ts.map +0 -1
  582. package/dist/src/teamcity-client/models/trigger.d.ts +0 -13
  583. package/dist/src/teamcity-client/models/trigger.d.ts.map +0 -1
  584. package/dist/src/teamcity-client/models/triggered-by.d.ts +0 -16
  585. package/dist/src/teamcity-client/models/triggered-by.d.ts.map +0 -1
  586. package/dist/src/teamcity-client/models/triggers.d.ts +0 -6
  587. package/dist/src/teamcity-client/models/triggers.d.ts.map +0 -1
  588. package/dist/src/teamcity-client/models/type.d.ts +0 -4
  589. package/dist/src/teamcity-client/models/type.d.ts.map +0 -1
  590. package/dist/src/teamcity-client/models/typed-value-set.d.ts +0 -10
  591. package/dist/src/teamcity-client/models/typed-value-set.d.ts.map +0 -1
  592. package/dist/src/teamcity-client/models/typed-value-sets.d.ts +0 -6
  593. package/dist/src/teamcity-client/models/typed-value-sets.d.ts.map +0 -1
  594. package/dist/src/teamcity-client/models/typed-value.d.ts +0 -6
  595. package/dist/src/teamcity-client/models/typed-value.d.ts.map +0 -1
  596. package/dist/src/teamcity-client/models/user-approval-rule.d.ts +0 -6
  597. package/dist/src/teamcity-client/models/user-approval-rule.d.ts.map +0 -1
  598. package/dist/src/teamcity-client/models/user-approvals.d.ts +0 -6
  599. package/dist/src/teamcity-client/models/user-approvals.d.ts.map +0 -1
  600. package/dist/src/teamcity-client/models/user-avatars.d.ts +0 -10
  601. package/dist/src/teamcity-client/models/user-avatars.d.ts.map +0 -1
  602. package/dist/src/teamcity-client/models/user-group-locator.d.ts +0 -6
  603. package/dist/src/teamcity-client/models/user-group-locator.d.ts.map +0 -1
  604. package/dist/src/teamcity-client/models/user-locator.d.ts +0 -15
  605. package/dist/src/teamcity-client/models/user-locator.d.ts.map +0 -1
  606. package/dist/src/teamcity-client/models/user.d.ts +0 -22
  607. package/dist/src/teamcity-client/models/user.d.ts.map +0 -1
  608. package/dist/src/teamcity-client/models/users.d.ts +0 -6
  609. package/dist/src/teamcity-client/models/users.d.ts.map +0 -1
  610. package/dist/src/teamcity-client/models/vcs-check-status.d.ts +0 -6
  611. package/dist/src/teamcity-client/models/vcs-check-status.d.ts.map +0 -1
  612. package/dist/src/teamcity-client/models/vcs-label.d.ts +0 -18
  613. package/dist/src/teamcity-client/models/vcs-label.d.ts.map +0 -1
  614. package/dist/src/teamcity-client/models/vcs-labels.d.ts +0 -6
  615. package/dist/src/teamcity-client/models/vcs-labels.d.ts.map +0 -1
  616. package/dist/src/teamcity-client/models/vcs-root-entries.d.ts +0 -6
  617. package/dist/src/teamcity-client/models/vcs-root-entries.d.ts.map +0 -1
  618. package/dist/src/teamcity-client/models/vcs-root-entry.d.ts +0 -8
  619. package/dist/src/teamcity-client/models/vcs-root-entry.d.ts.map +0 -1
  620. package/dist/src/teamcity-client/models/vcs-root-instance-locator.d.ts +0 -38
  621. package/dist/src/teamcity-client/models/vcs-root-instance-locator.d.ts.map +0 -1
  622. package/dist/src/teamcity-client/models/vcs-root-instance.d.ts +0 -24
  623. package/dist/src/teamcity-client/models/vcs-root-instance.d.ts.map +0 -1
  624. package/dist/src/teamcity-client/models/vcs-root-instances.d.ts +0 -9
  625. package/dist/src/teamcity-client/models/vcs-root-instances.d.ts.map +0 -1
  626. package/dist/src/teamcity-client/models/vcs-root-locator.d.ts +0 -37
  627. package/dist/src/teamcity-client/models/vcs-root-locator.d.ts.map +0 -1
  628. package/dist/src/teamcity-client/models/vcs-root.d.ts +0 -20
  629. package/dist/src/teamcity-client/models/vcs-root.d.ts.map +0 -1
  630. package/dist/src/teamcity-client/models/vcs-roots.d.ts +0 -9
  631. package/dist/src/teamcity-client/models/vcs-roots.d.ts.map +0 -1
  632. package/dist/src/teamcity-client/models/vcs-status.d.ts +0 -6
  633. package/dist/src/teamcity-client/models/vcs-status.d.ts.map +0 -1
  634. package/dist/src/teamcity-client/models/versioned-settings-config.d.ts +0 -31
  635. package/dist/src/teamcity-client/models/versioned-settings-config.d.ts.map +0 -1
  636. package/dist/src/teamcity-client/models/versioned-settings-context-parameter.d.ts +0 -5
  637. package/dist/src/teamcity-client/models/versioned-settings-context-parameter.d.ts.map +0 -1
  638. package/dist/src/teamcity-client/models/versioned-settings-context-parameters.d.ts +0 -5
  639. package/dist/src/teamcity-client/models/versioned-settings-context-parameters.d.ts.map +0 -1
  640. package/dist/src/teamcity-client/models/versioned-settings-error.d.ts +0 -7
  641. package/dist/src/teamcity-client/models/versioned-settings-error.d.ts.map +0 -1
  642. package/dist/src/teamcity-client/models/versioned-settings-status.d.ts +0 -15
  643. package/dist/src/teamcity-client/models/versioned-settings-status.d.ts.map +0 -1
  644. package/dist/src/teamcity-client/models/versioned-settings-token.d.ts +0 -6
  645. package/dist/src/teamcity-client/models/versioned-settings-token.d.ts.map +0 -1
  646. package/dist/src/teamcity-client/models/versioned-settings-tokens.d.ts +0 -5
  647. package/dist/src/teamcity-client/models/versioned-settings-tokens.d.ts.map +0 -1
  648. package/dist/src/tools/index.d.ts +0 -2
  649. package/dist/src/tools/index.d.ts.map +0 -1
  650. package/dist/src/tools.d.ts +0 -22
  651. package/dist/src/tools.d.ts.map +0 -1
  652. package/dist/src/types/config.d.ts +0 -129
  653. package/dist/src/types/config.d.ts.map +0 -1
  654. package/dist/src/types/index.d.ts +0 -116
  655. package/dist/src/types/index.d.ts.map +0 -1
  656. package/dist/src/types/mcp.d.ts +0 -68
  657. package/dist/src/types/mcp.d.ts.map +0 -1
  658. package/dist/src/types/project.d.ts +0 -56
  659. package/dist/src/types/project.d.ts.map +0 -1
  660. package/dist/src/types/teamcity.d.ts +0 -258
  661. package/dist/src/types/teamcity.d.ts.map +0 -1
  662. package/dist/src/utils/async/index.d.ts +0 -90
  663. package/dist/src/utils/async/index.d.ts.map +0 -1
  664. package/dist/src/utils/error-logger.d.ts +0 -34
  665. package/dist/src/utils/error-logger.d.ts.map +0 -1
  666. package/dist/src/utils/index.d.ts +0 -23
  667. package/dist/src/utils/index.d.ts.map +0 -1
  668. package/dist/src/utils/logger/index.d.ts +0 -73
  669. package/dist/src/utils/logger/index.d.ts.map +0 -1
  670. package/dist/src/utils/logger.d.ts +0 -11
  671. package/dist/src/utils/logger.d.ts.map +0 -1
  672. package/dist/src/utils/lru-cache.d.ts +0 -20
  673. package/dist/src/utils/lru-cache.d.ts.map +0 -1
  674. package/dist/src/utils/mcp.d.ts +0 -18
  675. package/dist/src/utils/mcp.d.ts.map +0 -1
  676. package/dist/src/utils/validation.d.ts +0 -61
  677. package/dist/src/utils/validation.d.ts.map +0 -1
  678. package/docs/TEAMCITY_MCP_TOOLS_GUIDE.md +0 -1076
  679. package/docs/mcp-tools-mode-matrix.md +0 -68
  680. package/docs/mcp-tools-reference.md +0 -203
  681. package/examples/list-build-configs-usage.ts +0 -276
  682. package/jest.ci.config.js +0 -14
  683. package/jest.config.js +0 -108
  684. package/jest.setup.js +0 -24
  685. package/openapi-generator-config.json +0 -27
  686. package/openapitools.json +0 -7
  687. package/scripts/build.cjs +0 -106
  688. package/scripts/debug-fetch-log.ts +0 -52
  689. package/scripts/emit-coverage-stats.js +0 -42
  690. package/scripts/fetch-swagger-spec.ts +0 -140
  691. package/scripts/generate-third-party-notices.cjs +0 -71
  692. package/scripts/interact.sh +0 -23
  693. package/scripts/print-builds.ts +0 -21
  694. package/scripts/verify-integration-env.cjs +0 -29
  695. package/src/api-client.ts +0 -307
  696. package/src/config/index.ts +0 -286
  697. package/src/errors/index.ts +0 -25
  698. package/src/formatters/build-step-formatter.ts +0 -178
  699. package/src/formatters/trigger-formatter.ts +0 -207
  700. package/src/index.ts +0 -60
  701. package/src/middleware/error.test.ts +0 -274
  702. package/src/middleware/error.ts +0 -314
  703. package/src/middleware/global-error-handler.test.ts +0 -239
  704. package/src/middleware/global-error-handler.ts +0 -214
  705. package/src/middleware/index.ts +0 -5
  706. package/src/server.ts +0 -126
  707. package/src/swagger/index.ts +0 -220
  708. package/src/swagger/swagger-cache.ts +0 -220
  709. package/src/swagger/swagger-fetcher.ts +0 -126
  710. package/src/swagger/swagger-validator.ts +0 -212
  711. package/src/teamcity/api-types.ts +0 -387
  712. package/src/teamcity/artifact-manager.ts +0 -362
  713. package/src/teamcity/auth.ts +0 -219
  714. package/src/teamcity/branch-discovery-manager.ts +0 -311
  715. package/src/teamcity/branch-filtering-service.ts +0 -369
  716. package/src/teamcity/branch-specification-parser.ts +0 -238
  717. package/src/teamcity/build-config-manager.ts +0 -458
  718. package/src/teamcity/build-config-navigator.ts +0 -589
  719. package/src/teamcity/build-configuration-clone-manager.ts +0 -501
  720. package/src/teamcity/build-configuration-manager.ts +0 -447
  721. package/src/teamcity/build-configuration-resolver.ts +0 -725
  722. package/src/teamcity/build-configuration-update-manager.ts +0 -610
  723. package/src/teamcity/build-list-manager.ts +0 -313
  724. package/src/teamcity/build-parameters-manager.ts +0 -875
  725. package/src/teamcity/build-progress-tracker.ts +0 -514
  726. package/src/teamcity/build-query-builder.ts +0 -325
  727. package/src/teamcity/build-queue-manager.ts +0 -622
  728. package/src/teamcity/build-results-manager.ts +0 -589
  729. package/src/teamcity/build-status-manager.ts +0 -564
  730. package/src/teamcity/build-step-manager.ts +0 -508
  731. package/src/teamcity/build-trigger-manager.ts +0 -1083
  732. package/src/teamcity/circuit-breaker.ts +0 -219
  733. package/src/teamcity/client-adapter.ts +0 -35
  734. package/src/teamcity/client.ts +0 -269
  735. package/src/teamcity/config.ts +0 -188
  736. package/src/teamcity/configuration-branch-matcher.ts +0 -327
  737. package/src/teamcity/errors.ts +0 -351
  738. package/src/teamcity/index.ts +0 -266
  739. package/src/teamcity/pagination.ts +0 -209
  740. package/src/teamcity/project-list-manager.ts +0 -267
  741. package/src/teamcity/project-manager.ts +0 -493
  742. package/src/teamcity/project-navigator.ts +0 -664
  743. package/src/teamcity/test-problem-reporter.ts +0 -423
  744. package/src/teamcity/types/api-responses.ts +0 -314
  745. package/src/teamcity-client/.openapi-generator/FILES +0 -274
  746. package/src/teamcity-client/.openapi-generator/VERSION +0 -1
  747. package/src/teamcity-client/.openapi-generator-ignore +0 -23
  748. package/src/teamcity-client/README.md +0 -50
  749. package/src/teamcity-client/api/agent-api.ts +0 -2046
  750. package/src/teamcity-client/api/agent-pool-api.ts +0 -1877
  751. package/src/teamcity-client/api/agent-type-api.ts +0 -213
  752. package/src/teamcity-client/api/audit-api.ts +0 -341
  753. package/src/teamcity-client/api/avatar-api.ts +0 -569
  754. package/src/teamcity-client/api/build-api.ts +0 -7726
  755. package/src/teamcity-client/api/build-queue-api.ts +0 -1922
  756. package/src/teamcity-client/api/build-type-api.ts +0 -15502
  757. package/src/teamcity-client/api/change-api.ts +0 -1311
  758. package/src/teamcity-client/api/cloud-instance-api.ts +0 -1289
  759. package/src/teamcity-client/api/deployment-dashboard-api.ts +0 -1295
  760. package/src/teamcity-client/api/global-server-settings-api.ts +0 -286
  761. package/src/teamcity-client/api/group-api.ts +0 -2084
  762. package/src/teamcity-client/api/health-api.ts +0 -566
  763. package/src/teamcity-client/api/investigation-api.ts +0 -856
  764. package/src/teamcity-client/api/mute-api.ts +0 -824
  765. package/src/teamcity-client/api/node-api.ts +0 -877
  766. package/src/teamcity-client/api/problem-api.ts +0 -337
  767. package/src/teamcity-client/api/problem-occurrence-api.ts +0 -349
  768. package/src/teamcity-client/api/project-api.ts +0 -6511
  769. package/src/teamcity-client/api/role-api.ts +0 -1062
  770. package/src/teamcity-client/api/root-api.ts +0 -439
  771. package/src/teamcity-client/api/server-api.ts +0 -2306
  772. package/src/teamcity-client/api/server-authentication-settings-api.ts +0 -289
  773. package/src/teamcity-client/api/test-api.ts +0 -329
  774. package/src/teamcity-client/api/test-occurrence-api.ts +0 -340
  775. package/src/teamcity-client/api/user-api.ts +0 -3644
  776. package/src/teamcity-client/api/vcs-root-api.ts +0 -1837
  777. package/src/teamcity-client/api/vcs-root-instance-api.ts +0 -2479
  778. package/src/teamcity-client/api/versioned-settings-api.ts +0 -2025
  779. package/src/teamcity-client/api.ts +0 -44
  780. package/src/teamcity-client/base.ts +0 -91
  781. package/src/teamcity-client/common.ts +0 -197
  782. package/src/teamcity-client/configuration.ts +0 -130
  783. package/src/teamcity-client/git_push.sh +0 -57
  784. package/src/teamcity-client/index.ts +0 -17
  785. package/src/teamcity-client/models/agent-locator.ts +0 -124
  786. package/src/teamcity-client/models/agent-pool-locator.ts +0 -63
  787. package/src/teamcity-client/models/agent-pool.ts +0 -87
  788. package/src/teamcity-client/models/agent-pools.ts +0 -54
  789. package/src/teamcity-client/models/agent-requirement.ts +0 -66
  790. package/src/teamcity-client/models/agent-requirements.ts +0 -36
  791. package/src/teamcity-client/models/agent-type-locator.ts +0 -51
  792. package/src/teamcity-client/models/agent-type.ts +0 -81
  793. package/src/teamcity-client/models/agent-types.ts +0 -54
  794. package/src/teamcity-client/models/agent.ts +0 -295
  795. package/src/teamcity-client/models/agents.ts +0 -54
  796. package/src/teamcity-client/models/approvable-build.ts +0 -39
  797. package/src/teamcity-client/models/approval-info.ts +0 -100
  798. package/src/teamcity-client/models/artifact-dependencies.ts +0 -42
  799. package/src/teamcity-client/models/artifact-dependency.ts +0 -75
  800. package/src/teamcity-client/models/artifact-download-info.ts +0 -33
  801. package/src/teamcity-client/models/audit-action.ts +0 -39
  802. package/src/teamcity-client/models/audit-event.ts +0 -66
  803. package/src/teamcity-client/models/audit-events.ts +0 -54
  804. package/src/teamcity-client/models/audit-locator.ts +0 -315
  805. package/src/teamcity-client/models/auth-module.ts +0 -36
  806. package/src/teamcity-client/models/auth-modules.ts +0 -30
  807. package/src/teamcity-client/models/authorization-tokens-requirements.ts +0 -33
  808. package/src/teamcity-client/models/authorized-info.ts +0 -36
  809. package/src/teamcity-client/models/branch-locator.ts +0 -117
  810. package/src/teamcity-client/models/branch-version.ts +0 -78
  811. package/src/teamcity-client/models/branch.ts +0 -72
  812. package/src/teamcity-client/models/branches.ts +0 -42
  813. package/src/teamcity-client/models/build-cancel-request.ts +0 -33
  814. package/src/teamcity-client/models/build-change.ts +0 -36
  815. package/src/teamcity-client/models/build-changes.ts +0 -36
  816. package/src/teamcity-client/models/build-executor.ts +0 -27
  817. package/src/teamcity-client/models/build-locator.ts +0 -277
  818. package/src/teamcity-client/models/build-queue-locator.ts +0 -87
  819. package/src/teamcity-client/models/build-status-update.ts +0 -33
  820. package/src/teamcity-client/models/build-trigger-customization.ts +0 -42
  821. package/src/teamcity-client/models/build-triggering-options.ts +0 -72
  822. package/src/teamcity-client/models/build-type-locator.ts +0 -111
  823. package/src/teamcity-client/models/build-type.ts +0 -305
  824. package/src/teamcity-client/models/build-types.ts +0 -54
  825. package/src/teamcity-client/models/build.ts +0 -631
  826. package/src/teamcity-client/models/builds-with-reason.ts +0 -36
  827. package/src/teamcity-client/models/builds.ts +0 -54
  828. package/src/teamcity-client/models/change-locator.ts +0 -129
  829. package/src/teamcity-client/models/change-status.ts +0 -114
  830. package/src/teamcity-client/models/change.ts +0 -186
  831. package/src/teamcity-client/models/changes.ts +0 -54
  832. package/src/teamcity-client/models/cleanup.ts +0 -51
  833. package/src/teamcity-client/models/cloud-error.ts +0 -33
  834. package/src/teamcity-client/models/cloud-image-locator.ts +0 -105
  835. package/src/teamcity-client/models/cloud-image.ts +0 -102
  836. package/src/teamcity-client/models/cloud-images.ts +0 -54
  837. package/src/teamcity-client/models/cloud-instance-locator.ts +0 -81
  838. package/src/teamcity-client/models/cloud-instance.ts +0 -90
  839. package/src/teamcity-client/models/cloud-instances.ts +0 -54
  840. package/src/teamcity-client/models/cloud-profile-locator.ts +0 -81
  841. package/src/teamcity-client/models/cloud-profile.ts +0 -72
  842. package/src/teamcity-client/models/cloud-profiles.ts +0 -54
  843. package/src/teamcity-client/models/comment.ts +0 -42
  844. package/src/teamcity-client/models/commiter.ts +0 -36
  845. package/src/teamcity-client/models/compatibilities.ts +0 -36
  846. package/src/teamcity-client/models/compatibility-policy.ts +0 -36
  847. package/src/teamcity-client/models/compatibility.ts +0 -54
  848. package/src/teamcity-client/models/composite-approval-rule.ts +0 -54
  849. package/src/teamcity-client/models/composite-approvals.ts +0 -36
  850. package/src/teamcity-client/models/cron.ts +0 -51
  851. package/src/teamcity-client/models/customizations.ts +0 -45
  852. package/src/teamcity-client/models/daily.ts +0 -33
  853. package/src/teamcity-client/models/datas.ts +0 -36
  854. package/src/teamcity-client/models/deployment-dashboard-locator.ts +0 -57
  855. package/src/teamcity-client/models/deployment-dashboard.ts +0 -51
  856. package/src/teamcity-client/models/deployment-dashboards.ts +0 -54
  857. package/src/teamcity-client/models/deployment-history.ts +0 -36
  858. package/src/teamcity-client/models/deployment-instance-locator.ts +0 -62
  859. package/src/teamcity-client/models/deployment-instance.ts +0 -68
  860. package/src/teamcity-client/models/deployment-instances.ts +0 -54
  861. package/src/teamcity-client/models/deployment-state-entries.ts +0 -45
  862. package/src/teamcity-client/models/deployment-state-entry.ts +0 -59
  863. package/src/teamcity-client/models/disabled-responsibilities.ts +0 -36
  864. package/src/teamcity-client/models/download-info.ts +0 -45
  865. package/src/teamcity-client/models/downloaded-artifacts.ts +0 -42
  866. package/src/teamcity-client/models/effective-responsibilities.ts +0 -36
  867. package/src/teamcity-client/models/enabled-info.ts +0 -42
  868. package/src/teamcity-client/models/enabled-responsibilities.ts +0 -36
  869. package/src/teamcity-client/models/entries.ts +0 -36
  870. package/src/teamcity-client/models/entry.ts +0 -33
  871. package/src/teamcity-client/models/environment.ts +0 -33
  872. package/src/teamcity-client/models/feature.ts +0 -66
  873. package/src/teamcity-client/models/features.ts +0 -36
  874. package/src/teamcity-client/models/file-change.ts +0 -63
  875. package/src/teamcity-client/models/file-changes.ts +0 -36
  876. package/src/teamcity-client/models/files.ts +0 -39
  877. package/src/teamcity-client/models/group-approval-rule.ts +0 -45
  878. package/src/teamcity-client/models/group-approvals.ts +0 -36
  879. package/src/teamcity-client/models/group.ts +0 -87
  880. package/src/teamcity-client/models/groups.ts +0 -36
  881. package/src/teamcity-client/models/health-categories.ts +0 -54
  882. package/src/teamcity-client/models/health-category.ts +0 -45
  883. package/src/teamcity-client/models/health-item.ts +0 -51
  884. package/src/teamcity-client/models/health-status-items.ts +0 -54
  885. package/src/teamcity-client/models/href.ts +0 -27
  886. package/src/teamcity-client/models/index.ts +0 -229
  887. package/src/teamcity-client/models/investigation-locator.ts +0 -125
  888. package/src/teamcity-client/models/investigation.ts +0 -100
  889. package/src/teamcity-client/models/investigations.ts +0 -54
  890. package/src/teamcity-client/models/issue-usage.ts +0 -39
  891. package/src/teamcity-client/models/issue.ts +0 -33
  892. package/src/teamcity-client/models/issues-usages.ts +0 -42
  893. package/src/teamcity-client/models/issues.ts +0 -30
  894. package/src/teamcity-client/models/items.ts +0 -27
  895. package/src/teamcity-client/models/labeled-value.ts +0 -33
  896. package/src/teamcity-client/models/license-key.ts +0 -134
  897. package/src/teamcity-client/models/license-keys.ts +0 -42
  898. package/src/teamcity-client/models/licensing-data.ts +0 -114
  899. package/src/teamcity-client/models/link.ts +0 -39
  900. package/src/teamcity-client/models/links.ts +0 -36
  901. package/src/teamcity-client/models/matrix-build-feature-descriptor.ts +0 -48
  902. package/src/teamcity-client/models/matrix-configuration.ts +0 -51
  903. package/src/teamcity-client/models/matrix-dependencies.ts +0 -36
  904. package/src/teamcity-client/models/matrix-dependency.ts +0 -39
  905. package/src/teamcity-client/models/matrix-parameter-descriptor.ts +0 -42
  906. package/src/teamcity-client/models/meta-data.ts +0 -36
  907. package/src/teamcity-client/models/metric-tag.ts +0 -33
  908. package/src/teamcity-client/models/metric-tags.ts +0 -36
  909. package/src/teamcity-client/models/metric-value.ts +0 -42
  910. package/src/teamcity-client/models/metric-values.ts +0 -36
  911. package/src/teamcity-client/models/metric.ts +0 -57
  912. package/src/teamcity-client/models/metrics.ts +0 -36
  913. package/src/teamcity-client/models/model-file.ts +0 -75
  914. package/src/teamcity-client/models/multiple-operation-result.ts +0 -42
  915. package/src/teamcity-client/models/mute-locator.ts +0 -108
  916. package/src/teamcity-client/models/mute.ts +0 -69
  917. package/src/teamcity-client/models/mutes.ts +0 -54
  918. package/src/teamcity-client/models/new-build-type-description.ts +0 -75
  919. package/src/teamcity-client/models/new-project-description.ts +0 -87
  920. package/src/teamcity-client/models/node.ts +0 -87
  921. package/src/teamcity-client/models/nodes.ts +0 -36
  922. package/src/teamcity-client/models/operation-result.ts +0 -36
  923. package/src/teamcity-client/models/parsed-test-name.ts +0 -63
  924. package/src/teamcity-client/models/permission-assignment.ts +0 -45
  925. package/src/teamcity-client/models/permission-assignments.ts +0 -36
  926. package/src/teamcity-client/models/permission-restriction.ts +0 -45
  927. package/src/teamcity-client/models/permission-restrictions.ts +0 -36
  928. package/src/teamcity-client/models/permission.ts +0 -39
  929. package/src/teamcity-client/models/permissions.ts +0 -36
  930. package/src/teamcity-client/models/pin-info.ts +0 -36
  931. package/src/teamcity-client/models/plugin.ts +0 -54
  932. package/src/teamcity-client/models/plugins.ts +0 -36
  933. package/src/teamcity-client/models/problem-locator.ts +0 -93
  934. package/src/teamcity-client/models/problem-occurrence-locator.ts +0 -99
  935. package/src/teamcity-client/models/problem-occurrence.ts +0 -114
  936. package/src/teamcity-client/models/problem-occurrences.ts +0 -84
  937. package/src/teamcity-client/models/problem-scope.ts +0 -48
  938. package/src/teamcity-client/models/problem-target.ts +0 -45
  939. package/src/teamcity-client/models/problem.ts +0 -84
  940. package/src/teamcity-client/models/problems.ts +0 -48
  941. package/src/teamcity-client/models/progress-info.ts +0 -78
  942. package/src/teamcity-client/models/project-feature.ts +0 -66
  943. package/src/teamcity-client/models/project-features.ts +0 -42
  944. package/src/teamcity-client/models/project-locator.ts +0 -123
  945. package/src/teamcity-client/models/project.ts +0 -207
  946. package/src/teamcity-client/models/projects.ts +0 -54
  947. package/src/teamcity-client/models/properties.ts +0 -42
  948. package/src/teamcity-client/models/property.ts +0 -48
  949. package/src/teamcity-client/models/related-entities.ts +0 -36
  950. package/src/teamcity-client/models/related-entity.ts +0 -144
  951. package/src/teamcity-client/models/related.ts +0 -30
  952. package/src/teamcity-client/models/repository-state.ts +0 -42
  953. package/src/teamcity-client/models/requirements.ts +0 -27
  954. package/src/teamcity-client/models/resolution.ts +0 -41
  955. package/src/teamcity-client/models/responsibility.ts +0 -33
  956. package/src/teamcity-client/models/revision.ts +0 -54
  957. package/src/teamcity-client/models/revisions.ts +0 -42
  958. package/src/teamcity-client/models/role.ts +0 -39
  959. package/src/teamcity-client/models/roles.ts +0 -30
  960. package/src/teamcity-client/models/server-auth-settings.ts +0 -72
  961. package/src/teamcity-client/models/server-global-settings.ts +0 -93
  962. package/src/teamcity-client/models/server.ts +0 -156
  963. package/src/teamcity-client/models/snapshot-dependencies.ts +0 -36
  964. package/src/teamcity-client/models/snapshot-dependency-link.ts +0 -45
  965. package/src/teamcity-client/models/snapshot-dependency.ts +0 -75
  966. package/src/teamcity-client/models/state-field.ts +0 -33
  967. package/src/teamcity-client/models/step.ts +0 -72
  968. package/src/teamcity-client/models/steps.ts +0 -36
  969. package/src/teamcity-client/models/tag-locator.ts +0 -39
  970. package/src/teamcity-client/models/tag.ts +0 -42
  971. package/src/teamcity-client/models/tags.ts +0 -36
  972. package/src/teamcity-client/models/team-city-node-locator.ts +0 -39
  973. package/src/teamcity-client/models/test-counters.ts +0 -63
  974. package/src/teamcity-client/models/test-locator.ts +0 -87
  975. package/src/teamcity-client/models/test-occurrence-locator.ts +0 -147
  976. package/src/teamcity-client/models/test-occurrence.ts +0 -173
  977. package/src/teamcity-client/models/test-occurrences.ts +0 -93
  978. package/src/teamcity-client/models/test-run-metadata.ts +0 -36
  979. package/src/teamcity-client/models/tests.ts +0 -57
  980. package/src/teamcity-client/models/token.ts +0 -54
  981. package/src/teamcity-client/models/tokens.ts +0 -36
  982. package/src/teamcity-client/models/trigger.ts +0 -75
  983. package/src/teamcity-client/models/triggered-by.ts +0 -87
  984. package/src/teamcity-client/models/triggers.ts +0 -36
  985. package/src/teamcity-client/models/type.ts +0 -27
  986. package/src/teamcity-client/models/typed-value-set.ts +0 -60
  987. package/src/teamcity-client/models/typed-value-sets.ts +0 -36
  988. package/src/teamcity-client/models/typed-value.ts +0 -39
  989. package/src/teamcity-client/models/user-approval-rule.ts +0 -36
  990. package/src/teamcity-client/models/user-approvals.ts +0 -36
  991. package/src/teamcity-client/models/user-avatars.ts +0 -63
  992. package/src/teamcity-client/models/user-group-locator.ts +0 -39
  993. package/src/teamcity-client/models/user-locator.ts +0 -93
  994. package/src/teamcity-client/models/user.ts +0 -123
  995. package/src/teamcity-client/models/users.ts +0 -36
  996. package/src/teamcity-client/models/vcs-check-status.ts +0 -39
  997. package/src/teamcity-client/models/vcs-label.ts +0 -65
  998. package/src/teamcity-client/models/vcs-labels.ts +0 -36
  999. package/src/teamcity-client/models/vcs-root-entries.ts +0 -36
  1000. package/src/teamcity-client/models/vcs-root-entry.ts +0 -48
  1001. package/src/teamcity-client/models/vcs-root-instance-locator.ts +0 -124
  1002. package/src/teamcity-client/models/vcs-root-instance.ts +0 -132
  1003. package/src/teamcity-client/models/vcs-root-instances.ts +0 -54
  1004. package/src/teamcity-client/models/vcs-root-locator.ts +0 -118
  1005. package/src/teamcity-client/models/vcs-root.ts +0 -111
  1006. package/src/teamcity-client/models/vcs-roots.ts +0 -54
  1007. package/src/teamcity-client/models/vcs-status.ts +0 -36
  1008. package/src/teamcity-client/models/versioned-settings-config.ts +0 -111
  1009. package/src/teamcity-client/models/versioned-settings-context-parameter.ts +0 -33
  1010. package/src/teamcity-client/models/versioned-settings-context-parameters.ts +0 -30
  1011. package/src/teamcity-client/models/versioned-settings-error.ts +0 -45
  1012. package/src/teamcity-client/models/versioned-settings-status.ts +0 -68
  1013. package/src/teamcity-client/models/versioned-settings-token.ts +0 -39
  1014. package/src/teamcity-client/models/versioned-settings-tokens.ts +0 -30
  1015. package/src/teamcity-client/package.json +0 -33
  1016. package/src/teamcity-client/tsconfig.esm.json +0 -7
  1017. package/src/teamcity-client/tsconfig.json +0 -13
  1018. package/src/teamcity-client-types.d.ts +0 -27
  1019. package/src/tools/index.ts +0 -2
  1020. package/src/tools.ts +0 -2904
  1021. package/src/types/config.ts +0 -140
  1022. package/src/types/index.ts +0 -171
  1023. package/src/types/mcp.ts +0 -80
  1024. package/src/types/project.ts +0 -128
  1025. package/src/types/teamcity.ts +0 -289
  1026. package/src/utils/async/index.test.ts +0 -664
  1027. package/src/utils/async/index.ts +0 -578
  1028. package/src/utils/error-logger.test.ts +0 -173
  1029. package/src/utils/error-logger.ts +0 -145
  1030. package/src/utils/index.ts +0 -88
  1031. package/src/utils/logger/index.test.ts +0 -271
  1032. package/src/utils/logger/index.ts +0 -441
  1033. package/src/utils/logger.ts +0 -49
  1034. package/src/utils/lru-cache.ts +0 -105
  1035. package/src/utils/mcp.ts +0 -84
  1036. package/src/utils/validation.ts +0 -284
  1037. package/tests/__mocks__/@modelcontextprotocol/sdk/server/index.js +0 -31
  1038. package/tests/__mocks__/@modelcontextprotocol/sdk/server/stdio.js +0 -12
  1039. package/tests/__mocks__/@modelcontextprotocol/sdk/types.js +0 -16
  1040. package/tests/development-tooling.test.ts +0 -207
  1041. package/tests/e2e/cleanup.ts +0 -68
  1042. package/tests/e2e/index.ts +0 -166
  1043. package/tests/e2e/mcp-client.ts +0 -73
  1044. package/tests/e2e/setup-playground.ts +0 -67
  1045. package/tests/integration/branches-and-queue-scenario.test.ts +0 -108
  1046. package/tests/integration/build-config-clone-update-scenario.test.ts +0 -80
  1047. package/tests/integration/build-results-and-logs-scenario.test.ts +0 -136
  1048. package/tests/integration/dev-tools-list.test.ts +0 -103
  1049. package/tests/integration/e2e-scenario.test.ts +0 -147
  1050. package/tests/integration/lib/mcp-runner.ts +0 -59
  1051. package/tests/integration/parameters-scenario.test.ts +0 -85
  1052. package/tests/integration/pause-configs-scenario.test.ts +0 -74
  1053. package/tests/integration/queue-maintenance-scenario.test.ts +0 -132
  1054. package/tests/integration/server-health-scenario.test.ts +0 -59
  1055. package/tests/integration/triggers-scenario.test.ts +0 -80
  1056. package/tests/integration/vcs-scenario.test.ts +0 -78
  1057. package/tests/jest.test.js +0 -122
  1058. package/tests/mcp-server.test.ts +0 -378
  1059. package/tests/setup.test.js +0 -97
  1060. package/tests/setup.ts +0 -88
  1061. package/tests/swagger/swagger-fetcher.test.ts +0 -619
  1062. package/tests/teamcity/auth.test.ts +0 -276
  1063. package/tests/teamcity/circuit-breaker.test.ts +0 -304
  1064. package/tests/teamcity/errors.test.ts +0 -221
  1065. package/tests/test-utils/mock-logger.ts +0 -15
  1066. package/tests/test-utils/mock-teamcity-client.ts +0 -403
  1067. package/tests/testing-infrastructure.test.ts +0 -209
  1068. package/tests/tooling.test.js +0 -118
  1069. package/tests/types/shims.d.ts +0 -20
  1070. package/tests/types/tool-results.ts +0 -68
  1071. package/tests/typescript.test.js +0 -108
  1072. package/tests/unit/mcp/server-lifecycle.test.ts +0 -301
  1073. package/tests/unit/middleware/error.test.ts +0 -283
  1074. package/tests/unit/server.test.ts +0 -102
  1075. package/tests/unit/swagger/swagger-manager.test.ts +0 -89
  1076. package/tests/unit/teamcity/artifact-manager.test.ts +0 -450
  1077. package/tests/unit/teamcity/branch-discovery-manager.test.ts +0 -561
  1078. package/tests/unit/teamcity/branch-filtering-service.test.ts +0 -481
  1079. package/tests/unit/teamcity/branch-specification-parser.test.ts +0 -443
  1080. package/tests/unit/teamcity/build-config-navigator-more.test.ts +0 -245
  1081. package/tests/unit/teamcity/build-config-navigator.test.ts +0 -1452
  1082. package/tests/unit/teamcity/build-configuration-manager.test.ts +0 -750
  1083. package/tests/unit/teamcity/build-configuration-resolver.test.ts +0 -659
  1084. package/tests/unit/teamcity/build-list-manager.test.ts +0 -574
  1085. package/tests/unit/teamcity/build-parameters-manager.test.ts +0 -712
  1086. package/tests/unit/teamcity/build-progress-tracker.test.ts +0 -1030
  1087. package/tests/unit/teamcity/build-query-builder.test.ts +0 -311
  1088. package/tests/unit/teamcity/build-queue-manager.test.ts +0 -879
  1089. package/tests/unit/teamcity/build-results-manager.test.ts +0 -630
  1090. package/tests/unit/teamcity/build-status-manager.test.ts +0 -640
  1091. package/tests/unit/teamcity/build-step-manager.test.ts +0 -886
  1092. package/tests/unit/teamcity/build-trigger-manager.test.ts +0 -1052
  1093. package/tests/unit/teamcity/configuration-branch-matcher.test.ts +0 -692
  1094. package/tests/unit/teamcity/pagination.test.ts +0 -118
  1095. package/tests/unit/teamcity/project-list-manager.test.ts +0 -118
  1096. package/tests/unit/teamcity/project-manager-branches.test.ts +0 -176
  1097. package/tests/unit/teamcity/project-manager-more.test.ts +0 -90
  1098. package/tests/unit/teamcity/project-manager.test.ts +0 -189
  1099. package/tests/unit/teamcity/project-navigator-branches.test.ts +0 -168
  1100. package/tests/unit/teamcity/project-navigator-more.test.ts +0 -58
  1101. package/tests/unit/teamcity/project-navigator.test.ts +0 -791
  1102. package/tests/unit/teamcity/test-problem-reporter-trend-patterns.test.ts +0 -80
  1103. package/tests/unit/teamcity/test-problem-reporter.test.ts +0 -551
  1104. package/tests/unit/tools/agent-vcs-admin.test.ts +0 -121
  1105. package/tests/unit/tools/availability-and-queue.test.ts +0 -118
  1106. package/tests/unit/tools/branches-vcs-agents.test.ts +0 -119
  1107. package/tests/unit/tools/build-actions-and-status.test.ts +0 -125
  1108. package/tests/unit/tools/bulk-surface-coverage.test.ts +0 -116
  1109. package/tests/unit/tools/compatibility-lookups.test.ts +0 -150
  1110. package/tests/unit/tools/fetch-build-log-ambiguity.test.ts +0 -70
  1111. package/tests/unit/tools/fetch-build-log-by-number.test.ts +0 -66
  1112. package/tests/unit/tools/fetch-build-log-pagination.test.ts +0 -73
  1113. package/tests/unit/tools/fetch-build-log-tail.test.ts +0 -33
  1114. package/tests/unit/tools/get-status-and-results.test.ts +0 -67
  1115. package/tests/unit/tools/list-branches-and-parameters.test.ts +0 -36
  1116. package/tests/unit/tools/list-build-configs-pagination.test.ts +0 -39
  1117. package/tests/unit/tools/list-builds-pagination.test.ts +0 -45
  1118. package/tests/unit/tools/list-pagination-all.test.ts +0 -259
  1119. package/tests/unit/tools/list-projects-pagination.test.ts +0 -39
  1120. package/tests/unit/tools/parameters-and-steps-triggers.test.ts +0 -176
  1121. package/tests/unit/tools/project-build-crud.test.ts +0 -110
  1122. package/tests/unit/tools/project-hierarchy.test.ts +0 -46
  1123. package/tests/unit/tools/queue-maintenance.test.ts +0 -130
  1124. package/tests/unit/tools/server-health-and-metrics.test.ts +0 -134
  1125. package/tests/unit/tools/simple-getters.test.ts +0 -88
  1126. package/tests/unit/tools/update_project_settings.test.ts +0 -64
  1127. package/tests/unit/utils/lru-cache.test.ts +0 -77
  1128. package/tests/unit/utils/mcp.test.ts +0 -82
  1129. package/tests/unit/utils/runTool.test.ts +0 -38
  1130. package/tests/unit/utils/validation.test.ts +0 -168
  1131. package/tsconfig.build.json +0 -28
  1132. package/tsconfig.json +0 -60
  1133. package/tsconfig.lint.json +0 -13
package/src/tools.ts DELETED
@@ -1,2904 +0,0 @@
1
- /**
2
- * Static Tool Definitions for TeamCity MCP Server
3
- * Simple, direct tool implementations without complex abstractions
4
- */
5
- import { z } from 'zod';
6
-
7
- import { getMCPMode as getMCPModeFromConfig } from '@/config';
8
- import { BuildResultsManager } from '@/teamcity/build-results-manager';
9
- import { createAdapterFromTeamCityAPI } from '@/teamcity/client-adapter';
10
- import { createPaginatedFetcher, fetchAllPages } from '@/teamcity/pagination';
11
- import { debug } from '@/utils/logger';
12
- import { json, runTool } from '@/utils/mcp';
13
-
14
- import { TeamCityAPI } from './api-client';
15
-
16
- // Tool response type
17
- export interface ToolResponse {
18
- content?: Array<{ type: string; text: string }>;
19
- error?: string;
20
- success?: boolean;
21
- data?: unknown;
22
- }
23
-
24
- // Tool definition - handlers use unknown but are cast internally
25
- export interface ToolDefinition {
26
- name: string;
27
- description: string;
28
- inputSchema: unknown;
29
- handler: (args: unknown) => Promise<ToolResponse>;
30
- mode?: 'dev' | 'full'; // If not specified, available in both modes
31
- }
32
-
33
- // Specific argument types are intentionally scoped to the handlers that use them.
34
- // Zod validates at runtime; these interfaces keep compile-time safety and clean linting.
35
- interface DeleteProjectArgs {
36
- projectId: string;
37
- }
38
- interface CreateBuildConfigArgs {
39
- projectId: string;
40
- name: string;
41
- id: string;
42
- description?: string;
43
- }
44
- interface CloneBuildConfigArgs {
45
- sourceBuildTypeId: string;
46
- name: string;
47
- id: string;
48
- projectId?: string;
49
- }
50
- interface UpdateBuildConfigArgs {
51
- buildTypeId: string;
52
- name?: string;
53
- description?: string;
54
- paused?: boolean;
55
- artifactRules?: string;
56
- }
57
- interface AddParameterArgs {
58
- buildTypeId: string;
59
- name: string;
60
- value: string;
61
- }
62
- interface UpdateParameterArgs {
63
- buildTypeId: string;
64
- name: string;
65
- value: string;
66
- }
67
- interface DeleteParameterArgs {
68
- buildTypeId: string;
69
- name: string;
70
- }
71
- interface CreateVCSRootArgs {
72
- projectId: string;
73
- name: string;
74
- id: string;
75
- vcsName: string;
76
- url: string;
77
- branch?: string;
78
- }
79
- interface AuthorizeAgentArgs {
80
- agentId: string;
81
- authorize: boolean;
82
- }
83
- interface AssignAgentToPoolArgs {
84
- agentId: string;
85
- poolId: string;
86
- }
87
- interface ManageBuildStepsArgs {
88
- buildTypeId: string;
89
- action: 'add' | 'update' | 'delete';
90
- stepId?: string;
91
- name?: string;
92
- type?: string;
93
- properties?: Record<string, unknown>;
94
- }
95
- interface ManageBuildTriggersArgs {
96
- buildTypeId: string;
97
- action: 'add' | 'delete';
98
- triggerId?: string;
99
- type?: string;
100
- properties?: Record<string, unknown>;
101
- }
102
-
103
- /**
104
- * Get the current MCP mode from environment
105
- */
106
- export function getMCPMode(): 'dev' | 'full' {
107
- return getMCPModeFromConfig();
108
- }
109
-
110
- /**
111
- * Developer tools (dev mode) - Read-only operations for developers
112
- */
113
- const DEV_TOOLS: ToolDefinition[] = [
114
- // === Basic Tools ===
115
- {
116
- name: 'ping',
117
- description: 'Test MCP server connectivity',
118
- inputSchema: {
119
- type: 'object',
120
- properties: {
121
- message: { type: 'string', description: 'Optional message to echo back' },
122
- },
123
- },
124
- handler: async (args: unknown) => {
125
- const typedArgs = args as { message?: string };
126
- return {
127
- content: [
128
- {
129
- type: 'text',
130
- text: `pong${typedArgs.message ? `: ${typedArgs.message}` : ''}`,
131
- },
132
- ],
133
- };
134
- },
135
- },
136
-
137
- // === Project Tools ===
138
- {
139
- name: 'list_projects',
140
- description: 'List TeamCity projects (supports pagination)',
141
- inputSchema: {
142
- type: 'object',
143
- properties: {
144
- locator: { type: 'string', description: 'Optional locator to filter projects' },
145
- parentProjectId: { type: 'string', description: 'Filter by parent project ID' },
146
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
147
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
148
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
149
- fields: {
150
- type: 'string',
151
- description: 'Optional fields selector for server-side projection',
152
- },
153
- },
154
- },
155
- handler: async (args: unknown) => {
156
- const schema = z.object({
157
- locator: z.string().min(1).optional(),
158
- parentProjectId: z.string().min(1).optional(),
159
- pageSize: z.number().int().min(1).max(1000).optional(),
160
- maxPages: z.number().int().min(1).max(1000).optional(),
161
- all: z.boolean().optional(),
162
- fields: z.string().min(1).optional(),
163
- });
164
- return runTool(
165
- 'list_projects',
166
- schema,
167
- async (typed) => {
168
- const api = TeamCityAPI.getInstance();
169
- const baseParts: string[] = [];
170
- if (typed.locator) baseParts.push(typed.locator);
171
- if (typed.parentProjectId) baseParts.push(`parent:(id:${typed.parentProjectId})`);
172
-
173
- const pageSize = typed.pageSize ?? 100;
174
-
175
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
176
- const parts = [...baseParts];
177
- if (typeof count === 'number') parts.push(`count:${count}`);
178
- if (typeof start === 'number') parts.push(`start:${start}`);
179
- const locator = parts.length > 0 ? parts.join(',') : undefined;
180
- return api.projects.getAllProjects(locator as string | undefined, typed.fields);
181
- };
182
-
183
- const fetcher = createPaginatedFetcher(
184
- baseFetch,
185
- (response: unknown) => {
186
- const data = response as { project?: unknown[]; count?: number };
187
- return Array.isArray(data.project) ? (data.project as unknown[]) : [];
188
- },
189
- (response: unknown) => {
190
- const data = response as { count?: number };
191
- return typeof data.count === 'number' ? data.count : undefined;
192
- }
193
- );
194
-
195
- if (typed.all) {
196
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
197
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
198
- }
199
-
200
- const firstPage = await fetcher({ count: pageSize, start: 0 });
201
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
202
- },
203
- args
204
- );
205
- },
206
- },
207
-
208
- {
209
- name: 'get_project',
210
- description: 'Get details of a specific project',
211
- inputSchema: {
212
- type: 'object',
213
- properties: {
214
- projectId: { type: 'string', description: 'Project ID' },
215
- },
216
- required: ['projectId'],
217
- },
218
- handler: async (args: unknown) => {
219
- const schema = z.object({ projectId: z.string().min(1) });
220
- return runTool(
221
- 'get_project',
222
- schema,
223
- async (typed) => {
224
- const api = TeamCityAPI.getInstance();
225
- const project = await api.getProject(typed.projectId);
226
- return json(project);
227
- },
228
- args
229
- );
230
- },
231
- },
232
-
233
- // === Build Tools ===
234
- {
235
- name: 'list_builds',
236
- description: 'List TeamCity builds (supports pagination)',
237
- inputSchema: {
238
- type: 'object',
239
- properties: {
240
- locator: { type: 'string', description: 'Optional build locator to filter builds' },
241
- projectId: { type: 'string', description: 'Filter by project ID' },
242
- buildTypeId: { type: 'string', description: 'Filter by build type ID' },
243
- status: {
244
- type: 'string',
245
- enum: ['SUCCESS', 'FAILURE', 'ERROR'],
246
- description: 'Filter by status',
247
- },
248
- count: { type: 'number', description: 'Deprecated: use pageSize', default: 10 },
249
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
250
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
251
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
252
- fields: {
253
- type: 'string',
254
- description: 'Optional fields selector for server-side projection',
255
- },
256
- },
257
- },
258
- handler: async (args: unknown) => {
259
- const schema = z.object({
260
- locator: z.string().min(1).optional(),
261
- projectId: z.string().min(1).optional(),
262
- buildTypeId: z.string().min(1).optional(),
263
- status: z.enum(['SUCCESS', 'FAILURE', 'ERROR']).optional(),
264
- count: z.number().int().min(1).max(1000).default(10).optional(),
265
- pageSize: z.number().int().min(1).max(1000).optional(),
266
- maxPages: z.number().int().min(1).max(1000).optional(),
267
- all: z.boolean().optional(),
268
- fields: z.string().min(1).optional(),
269
- });
270
-
271
- return runTool(
272
- 'list_builds',
273
- schema,
274
- async (typed) => {
275
- const api = TeamCityAPI.getInstance();
276
- // Build shared filter parts
277
- const baseParts: string[] = [];
278
- if (typed.locator) baseParts.push(typed.locator);
279
- if (typed.projectId) baseParts.push(`project:(id:${typed.projectId})`);
280
- if (typed.buildTypeId) baseParts.push(`buildType:(id:${typed.buildTypeId})`);
281
- if (typed.status) baseParts.push(`status:${typed.status}`);
282
-
283
- const pageSize = typed.pageSize ?? typed.count ?? 100;
284
-
285
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
286
- const parts = [...baseParts];
287
- if (typeof count === 'number') parts.push(`count:${count}`);
288
- if (typeof start === 'number') parts.push(`start:${start}`);
289
- const locator = parts.length > 0 ? parts.join(',') : undefined;
290
- // Use the generated client directly to retain nextHref/prevHref in response.data
291
- return api.builds.getAllBuilds(locator as string | undefined, typed.fields);
292
- };
293
-
294
- const fetcher = createPaginatedFetcher(
295
- baseFetch,
296
- (response: unknown) => {
297
- const data = response as { build?: unknown[]; count?: number };
298
- return Array.isArray(data.build) ? (data.build as unknown[]) : [];
299
- },
300
- (response: unknown) => {
301
- const data = response as { count?: number };
302
- return typeof data.count === 'number' ? data.count : undefined;
303
- }
304
- );
305
-
306
- if (typed.all) {
307
- const items = await fetchAllPages(fetcher, {
308
- pageSize,
309
- maxPages: typed.maxPages,
310
- });
311
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
312
- }
313
-
314
- // Single page
315
- const firstPage = await fetcher({ count: pageSize, start: 0 });
316
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
317
- },
318
- args
319
- );
320
- },
321
- },
322
-
323
- {
324
- name: 'get_build',
325
- description: 'Get details of a specific build',
326
- inputSchema: {
327
- type: 'object',
328
- properties: {
329
- buildId: { type: 'string', description: 'Build ID' },
330
- },
331
- required: ['buildId'],
332
- },
333
- handler: async (args: unknown) => {
334
- const schema = z.object({ buildId: z.string().min(1) });
335
- return runTool(
336
- 'get_build',
337
- schema,
338
- async (typed) => {
339
- const api = TeamCityAPI.getInstance();
340
- const build = await api.getBuild(typed.buildId);
341
- return json(build);
342
- },
343
- args
344
- );
345
- },
346
- },
347
-
348
- {
349
- name: 'trigger_build',
350
- description: 'Trigger a new build',
351
- inputSchema: {
352
- type: 'object',
353
- properties: {
354
- buildTypeId: { type: 'string', description: 'Build type ID to trigger' },
355
- branchName: { type: 'string', description: 'Branch to build (optional)' },
356
- comment: { type: 'string', description: 'Build comment (optional)' },
357
- },
358
- required: ['buildTypeId'],
359
- },
360
- handler: async (args: unknown) => {
361
- const schema = z.object({
362
- buildTypeId: z.string().min(1),
363
- branchName: z.string().min(1).max(255).optional(),
364
- comment: z.string().max(500).optional(),
365
- });
366
-
367
- return runTool(
368
- 'trigger_build',
369
- schema,
370
- async (typed) => {
371
- const api = TeamCityAPI.getInstance();
372
- try {
373
- const build = await api.triggerBuild(
374
- typed.buildTypeId,
375
- typed.branchName,
376
- typed.comment
377
- );
378
- return json({
379
- success: true,
380
- action: 'trigger_build',
381
- buildId: String(build.id ?? ''),
382
- state: (build.state as string) ?? undefined,
383
- status: (build.status as string) ?? undefined,
384
- });
385
- } catch (e) {
386
- // Fallback to XML body in case server rejects JSON body
387
- const branchPart = typed.branchName
388
- ? `<branchName>${typed.branchName}</branchName>`
389
- : '';
390
- const commentPart = typed.comment
391
- ? `<comment><text>${typed.comment.replace(/</g, '&lt;').replace(/>/g, '&gt;')}</text></comment>`
392
- : '';
393
- const xml = `<?xml version="1.0" encoding="UTF-8"?><build><buildType id="${typed.buildTypeId}"/>${branchPart}${commentPart}</build>`;
394
- const response = await api.buildQueue.addBuildToQueue(false, xml as unknown as never, {
395
- headers: { 'Content-Type': 'application/xml', Accept: 'application/json' },
396
- });
397
- const build = response.data as { id?: number; state?: string; status?: string };
398
- return json({
399
- success: true,
400
- action: 'trigger_build',
401
- buildId: String(build.id ?? ''),
402
- state: (build.state as string) ?? undefined,
403
- status: (build.status as string) ?? undefined,
404
- });
405
- }
406
- },
407
- args
408
- );
409
- },
410
- },
411
-
412
- {
413
- name: 'cancel_queued_build',
414
- description: 'Cancel a queued build by ID',
415
- inputSchema: {
416
- type: 'object',
417
- properties: {
418
- buildId: { type: 'string', description: 'Queued build ID' },
419
- },
420
- required: ['buildId'],
421
- },
422
- handler: async (args: unknown) => {
423
- const schema = z.object({ buildId: z.string().min(1) });
424
- return runTool(
425
- 'cancel_queued_build',
426
- schema,
427
- async (typed) => {
428
- const api = TeamCityAPI.getInstance();
429
- await api.buildQueue.deleteQueuedBuild(typed.buildId);
430
- return json({ success: true, action: 'cancel_queued_build', buildId: typed.buildId });
431
- },
432
- args
433
- );
434
- },
435
- // Available in dev and full modes (developer convenience)
436
- },
437
-
438
- {
439
- name: 'get_build_status',
440
- description: 'Get build status with optional test/problem and queue context details',
441
- inputSchema: {
442
- type: 'object',
443
- properties: {
444
- buildId: { type: 'string', description: 'Build ID' },
445
- includeTests: { type: 'boolean', description: 'Include test summary' },
446
- includeProblems: { type: 'boolean', description: 'Include build problems' },
447
- includeQueueTotals: {
448
- type: 'boolean',
449
- description: 'Include total queued count (extra API call when queued)',
450
- },
451
- includeQueueReason: {
452
- type: 'boolean',
453
- description: 'Include waitReason for the queued item (extra API call when queued)',
454
- },
455
- },
456
- required: ['buildId'],
457
- },
458
- handler: async (args: unknown) => {
459
- const schema = z.object({
460
- buildId: z.string().min(1),
461
- includeTests: z.boolean().optional(),
462
- includeProblems: z.boolean().optional(),
463
- includeQueueTotals: z.boolean().optional(),
464
- includeQueueReason: z.boolean().optional(),
465
- });
466
- return runTool(
467
- 'get_build_status',
468
- schema,
469
- async (typed) => {
470
- const api = TeamCityAPI.getInstance();
471
- const statusManager = new (
472
- await import('@/teamcity/build-status-manager')
473
- ).BuildStatusManager(createAdapterFromTeamCityAPI(api));
474
- const result = await statusManager.getBuildStatus({
475
- buildId: typed.buildId,
476
- includeTests: typed.includeTests,
477
- includeProblems: typed.includeProblems,
478
- });
479
-
480
- if (result.state === 'queued') {
481
- const enrich: { totalQueued?: number; waitReason?: string; canMoveToTop?: boolean } =
482
- {};
483
- // Derive canMoveToTop without extra call
484
- if (typeof result.queuePosition === 'number') {
485
- enrich.canMoveToTop = result.queuePosition > 1;
486
- }
487
-
488
- if (typed.includeQueueTotals) {
489
- try {
490
- const countResp = await api.buildQueue.getAllQueuedBuilds(undefined, 'count');
491
- enrich.totalQueued = (countResp.data as { count?: number }).count;
492
- } catch {
493
- /* ignore */
494
- }
495
- }
496
- if (typed.includeQueueReason) {
497
- try {
498
- const qb = await api.buildQueue.getQueuedBuild(typed.buildId);
499
- enrich.waitReason = (qb.data as { waitReason?: string }).waitReason;
500
- } catch {
501
- /* ignore */
502
- }
503
- }
504
- return json({ ...result, ...enrich });
505
- }
506
-
507
- return json(result);
508
- },
509
- args
510
- );
511
- },
512
- },
513
-
514
- {
515
- name: 'fetch_build_log',
516
- description: 'Fetch build log with pagination (by lines)',
517
- inputSchema: {
518
- type: 'object',
519
- properties: {
520
- buildId: { type: 'string', description: 'Build ID (TeamCity internal id)' },
521
- buildNumber: {
522
- type: 'string',
523
- description:
524
- 'Human build number (e.g., 54). If provided, optionally include buildTypeId to disambiguate.',
525
- },
526
- buildTypeId: {
527
- type: 'string',
528
- description: 'Optional build type ID to disambiguate buildNumber',
529
- },
530
- page: { type: 'number', description: '1-based page number' },
531
- pageSize: { type: 'number', description: 'Lines per page (default 500)' },
532
- startLine: { type: 'number', description: '0-based start line (overrides page)' },
533
- lineCount: { type: 'number', description: 'Max lines to return (overrides pageSize)' },
534
- tail: { type: 'boolean', description: 'Tail mode: return last N lines' },
535
- },
536
- required: [],
537
- },
538
- handler: async (args: unknown) => {
539
- const schema = z
540
- .object({
541
- buildId: z.string().min(1).optional(),
542
- buildNumber: z.union([z.string().min(1), z.number().int().min(0)]).optional(),
543
- buildTypeId: z.string().min(1).optional(),
544
- page: z.number().int().min(1).optional(),
545
- pageSize: z.number().int().min(1).max(5000).optional(),
546
- startLine: z.number().int().min(0).optional(),
547
- lineCount: z.number().int().min(1).max(5000).optional(),
548
- tail: z.boolean().optional(),
549
- })
550
- .refine((v) => Boolean(v.buildId) || Boolean(v.buildNumber), {
551
- message: 'Provide either buildId or buildNumber',
552
- });
553
-
554
- return runTool(
555
- 'fetch_build_log',
556
- schema,
557
- async (typed) => {
558
- const api = TeamCityAPI.getInstance();
559
-
560
- // Resolve effective buildId from buildId or buildNumber (+ optional buildTypeId)
561
- let effectiveBuildId: string | undefined;
562
- if (typed.buildId) {
563
- effectiveBuildId = typed.buildId;
564
- } else {
565
- const numberStr = String(typed.buildNumber);
566
- const baseLocatorParts: string[] = [];
567
- if (typed.buildTypeId) baseLocatorParts.push(`buildType:(id:${typed.buildTypeId})`);
568
- // Include non-default branches so build numbers on PR branches resolve
569
- baseLocatorParts.push('branch:default:any');
570
- baseLocatorParts.push(`number:${numberStr}`);
571
- // Limit result set to avoid huge payloads
572
- baseLocatorParts.push('count:10');
573
- const locator = baseLocatorParts.join(',');
574
- const resp = (await api.listBuilds(locator)) as {
575
- build?: Array<{ id?: number; buildTypeId?: string }>;
576
- };
577
- const builds = Array.isArray(resp.build) ? resp.build : [];
578
- if (builds.length === 0) {
579
- // Fallback: if buildTypeId is provided, fetch recent builds for that configuration and match by number
580
- if (typed.buildTypeId) {
581
- const recent = (await api.listBuilds(
582
- `buildType:(id:${typed.buildTypeId}),branch:default:any,count:100`
583
- )) as { build?: Array<{ id?: number; number?: string }> };
584
- const items = Array.isArray(recent.build) ? recent.build : [];
585
- const match = items.find((b) => String(b.number) === numberStr);
586
- if (match?.id != null) {
587
- effectiveBuildId = String(match.id);
588
- } else {
589
- throw new Error(
590
- `No build found with number ${numberStr} for buildTypeId ${typed.buildTypeId}`
591
- );
592
- }
593
- } else {
594
- throw new Error(
595
- `No build found with number ${numberStr}${typed.buildTypeId ? ` for buildTypeId ${typed.buildTypeId}` : ''}`
596
- );
597
- }
598
- }
599
- if (!effectiveBuildId && !typed.buildTypeId && builds.length > 1) {
600
- throw new Error(
601
- `Multiple builds match number ${numberStr}. Provide buildTypeId to disambiguate.`
602
- );
603
- }
604
- if (!effectiveBuildId) {
605
- const found = builds[0];
606
- if (!found?.id) {
607
- throw new Error('Resolved build has no id');
608
- }
609
- effectiveBuildId = String(found.id);
610
- }
611
- }
612
- if (!effectiveBuildId) {
613
- throw new Error('Failed to resolve buildId from inputs');
614
- }
615
-
616
- // Tail mode: return last N lines regardless of provided paging params
617
- if (typed.tail) {
618
- const count = typed.lineCount ?? typed.pageSize ?? 500;
619
- const full = await api.getBuildLog(effectiveBuildId);
620
- const allLines = full.replace(/\r\n/g, '\n').replace(/\r/g, '\n').split('\n');
621
- if (allLines.length > 0 && allLines[allLines.length - 1] === '') allLines.pop();
622
- const total = allLines.length;
623
- const start = Math.max(0, total - count);
624
- const lines = allLines.slice(start);
625
-
626
- return json({
627
- lines,
628
- meta: {
629
- buildId: effectiveBuildId,
630
- buildNumber:
631
- typeof typed.buildNumber !== 'undefined' ? String(typed.buildNumber) : undefined,
632
- buildTypeId: typed.buildTypeId,
633
- mode: 'tail',
634
- pageSize: count,
635
- startLine: start,
636
- hasMore: start > 0,
637
- totalLines: total,
638
- },
639
- });
640
- }
641
-
642
- const effectivePageSize = typed.lineCount ?? typed.pageSize ?? 500;
643
- const startLine =
644
- typeof typed.startLine === 'number'
645
- ? typed.startLine
646
- : ((typed.page ?? 1) - 1) * effectivePageSize;
647
-
648
- const chunk = await api.getBuildLogChunk(effectiveBuildId, {
649
- startLine,
650
- lineCount: effectivePageSize,
651
- });
652
-
653
- const page = Math.floor(startLine / effectivePageSize) + 1;
654
- const hasMore = chunk.nextStartLine !== undefined;
655
-
656
- return json({
657
- lines: chunk.lines,
658
- meta: {
659
- buildId: effectiveBuildId,
660
- buildNumber:
661
- typeof typed.buildNumber !== 'undefined' ? String(typed.buildNumber) : undefined,
662
- buildTypeId: typed.buildTypeId,
663
- page,
664
- pageSize: effectivePageSize,
665
- startLine: chunk.startLine,
666
- nextPage: hasMore ? page + 1 : undefined,
667
- prevPage: page > 1 ? page - 1 : undefined,
668
- hasMore,
669
- totalLines: chunk.totalLines,
670
- nextStartLine: chunk.nextStartLine,
671
- },
672
- });
673
- },
674
- args
675
- );
676
- },
677
- },
678
-
679
- // === Build Configuration Tools ===
680
- {
681
- name: 'list_build_configs',
682
- description: 'List build configurations (supports pagination)',
683
- inputSchema: {
684
- type: 'object',
685
- properties: {
686
- locator: { type: 'string', description: 'Optional build type locator to filter' },
687
- projectId: { type: 'string', description: 'Filter by project ID' },
688
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
689
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
690
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
691
- fields: {
692
- type: 'string',
693
- description: 'Optional fields selector for server-side projection',
694
- },
695
- },
696
- },
697
- handler: async (args: unknown) => {
698
- const schema = z.object({
699
- locator: z.string().min(1).optional(),
700
- projectId: z.string().min(1).optional(),
701
- pageSize: z.number().int().min(1).max(1000).optional(),
702
- maxPages: z.number().int().min(1).max(1000).optional(),
703
- all: z.boolean().optional(),
704
- fields: z.string().min(1).optional(),
705
- });
706
- return runTool(
707
- 'list_build_configs',
708
- schema,
709
- async (typed) => {
710
- const api = TeamCityAPI.getInstance();
711
- const baseParts: string[] = [];
712
- if (typed.locator) baseParts.push(typed.locator);
713
- if (typed.projectId) baseParts.push(`affectedProject:(id:${typed.projectId})`);
714
-
715
- const pageSize = typed.pageSize ?? 100;
716
-
717
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
718
- const parts = [...baseParts];
719
- if (typeof count === 'number') parts.push(`count:${count}`);
720
- if (typeof start === 'number') parts.push(`start:${start}`);
721
- const locator = parts.length > 0 ? parts.join(',') : undefined;
722
- return api.buildTypes.getAllBuildTypes(locator as string | undefined, typed.fields);
723
- };
724
-
725
- const fetcher = createPaginatedFetcher(
726
- baseFetch,
727
- (response: unknown) => {
728
- const data = response as { buildType?: unknown[]; count?: number };
729
- return Array.isArray(data.buildType) ? (data.buildType as unknown[]) : [];
730
- },
731
- (response: unknown) => {
732
- const data = response as { count?: number };
733
- return typeof data.count === 'number' ? data.count : undefined;
734
- }
735
- );
736
-
737
- if (typed.all) {
738
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
739
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
740
- }
741
-
742
- const firstPage = await fetcher({ count: pageSize, start: 0 });
743
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
744
- },
745
- args
746
- );
747
- },
748
- },
749
-
750
- {
751
- name: 'get_build_config',
752
- description: 'Get details of a build configuration',
753
- inputSchema: {
754
- type: 'object',
755
- properties: {
756
- buildTypeId: { type: 'string', description: 'Build type ID' },
757
- },
758
- required: ['buildTypeId'],
759
- },
760
- handler: async (args: unknown) => {
761
- const schema = z.object({ buildTypeId: z.string().min(1) });
762
- return runTool(
763
- 'get_build_config',
764
- schema,
765
- async (typed) => {
766
- const api = TeamCityAPI.getInstance();
767
- const buildType = await api.getBuildType(typed.buildTypeId);
768
- return json(buildType);
769
- },
770
- args
771
- );
772
- },
773
- },
774
-
775
- // === Test Tools ===
776
- {
777
- name: 'list_test_failures',
778
- description: 'List test failures for a build (supports pagination)',
779
- inputSchema: {
780
- type: 'object',
781
- properties: {
782
- buildId: { type: 'string', description: 'Build ID' },
783
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
784
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
785
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
786
- fields: {
787
- type: 'string',
788
- description: 'Optional fields selector for server-side projection',
789
- },
790
- },
791
- required: ['buildId'],
792
- },
793
- handler: async (args: unknown) => {
794
- const schema = z.object({
795
- buildId: z.string().min(1),
796
- pageSize: z.number().int().min(1).max(1000).optional(),
797
- maxPages: z.number().int().min(1).max(1000).optional(),
798
- all: z.boolean().optional(),
799
- fields: z.string().min(1).optional(),
800
- });
801
- return runTool(
802
- 'list_test_failures',
803
- schema,
804
- async (typed) => {
805
- const api = TeamCityAPI.getInstance();
806
- const pageSize = typed.pageSize ?? 100;
807
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
808
- const parts: string[] = [`build:(id:${typed.buildId})`, 'status:FAILURE'];
809
- if (typeof count === 'number') parts.push(`count:${count}`);
810
- if (typeof start === 'number') parts.push(`start:${start}`);
811
- const locator = parts.join(',');
812
- return api.tests.getAllTestOccurrences(locator as string, typed.fields);
813
- };
814
-
815
- const fetcher = createPaginatedFetcher(
816
- baseFetch,
817
- (response: unknown) => {
818
- const data = response as { testOccurrence?: unknown[]; count?: number };
819
- return Array.isArray(data.testOccurrence) ? (data.testOccurrence as unknown[]) : [];
820
- },
821
- (response: unknown) => {
822
- const data = response as { count?: number };
823
- return typeof data.count === 'number' ? data.count : undefined;
824
- }
825
- );
826
-
827
- if (typed.all) {
828
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
829
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
830
- }
831
-
832
- const firstPage = await fetcher({ count: pageSize, start: 0 });
833
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
834
- },
835
- args
836
- );
837
- },
838
- },
839
-
840
- // === VCS Tools ===
841
- {
842
- name: 'list_vcs_roots',
843
- description: 'List VCS roots (supports pagination)',
844
- inputSchema: {
845
- type: 'object',
846
- properties: {
847
- projectId: { type: 'string', description: 'Filter by project ID' },
848
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
849
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
850
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
851
- fields: {
852
- type: 'string',
853
- description: 'Optional fields selector for server-side projection',
854
- },
855
- },
856
- },
857
- handler: async (args: unknown) => {
858
- const schema = z.object({
859
- projectId: z.string().min(1).optional(),
860
- pageSize: z.number().int().min(1).max(1000).optional(),
861
- maxPages: z.number().int().min(1).max(1000).optional(),
862
- all: z.boolean().optional(),
863
- fields: z.string().min(1).optional(),
864
- });
865
- return runTool(
866
- 'list_vcs_roots',
867
- schema,
868
- async (typed) => {
869
- const api = TeamCityAPI.getInstance();
870
- const baseParts: string[] = [];
871
- if (typed.projectId) baseParts.push(`affectedProject:(id:${typed.projectId})`);
872
-
873
- const pageSize = typed.pageSize ?? 100;
874
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
875
- const parts = [...baseParts];
876
- if (typeof count === 'number') parts.push(`count:${count}`);
877
- if (typeof start === 'number') parts.push(`start:${start}`);
878
- const locator = parts.length > 0 ? parts.join(',') : undefined;
879
- return api.vcsRoots.getAllVcsRoots(locator as string | undefined, typed.fields);
880
- };
881
-
882
- const fetcher = createPaginatedFetcher(
883
- baseFetch,
884
- (response: unknown) => {
885
- const data = response as { ['vcs-root']?: unknown[]; count?: number };
886
- return Array.isArray(data['vcs-root']) ? (data['vcs-root'] as unknown[]) : [];
887
- },
888
- (response: unknown) => {
889
- const data = response as { count?: number };
890
- return typeof data.count === 'number' ? data.count : undefined;
891
- }
892
- );
893
-
894
- if (typed.all) {
895
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
896
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
897
- }
898
-
899
- const firstPage = await fetcher({ count: pageSize, start: 0 });
900
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
901
- },
902
- args
903
- );
904
- },
905
- },
906
-
907
- {
908
- name: 'get_vcs_root',
909
- description: 'Get details of a VCS root (including properties)',
910
- inputSchema: {
911
- type: 'object',
912
- properties: {
913
- id: { type: 'string', description: 'VCS root ID' },
914
- },
915
- required: ['id'],
916
- },
917
- handler: async (args: unknown) => {
918
- const schema = z.object({ id: z.string().min(1) });
919
- return runTool(
920
- 'get_vcs_root',
921
- schema,
922
- async (typed) => {
923
- const api = TeamCityAPI.getInstance();
924
- const listing = await api.vcsRoots.getAllVcsRoots(`id:${typed.id}`);
925
- const rootEntry = (listing.data as { vcsRoot?: unknown[] }).vcsRoot?.[0] as
926
- | { id?: string; name?: string; href?: string }
927
- | undefined;
928
- const props = await api.vcsRoots.getAllVcsRootProperties(typed.id);
929
- return json({
930
- id: rootEntry?.id ?? typed.id,
931
- name: rootEntry?.name,
932
- href: rootEntry?.href,
933
- properties: props.data,
934
- });
935
- },
936
- args
937
- );
938
- },
939
- },
940
-
941
- // === Queue (read-only) ===
942
- {
943
- name: 'list_queued_builds',
944
- description: 'List queued builds (supports TeamCity queue locator + pagination)',
945
- inputSchema: {
946
- type: 'object',
947
- properties: {
948
- locator: {
949
- type: 'string',
950
- description: 'Queue locator filter (e.g., project:(id:MyProj))',
951
- },
952
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
953
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
954
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
955
- fields: {
956
- type: 'string',
957
- description: 'Optional fields selector for server-side projection',
958
- },
959
- },
960
- },
961
- handler: async (args: unknown) => {
962
- const schema = z.object({
963
- locator: z.string().min(1).optional(),
964
- pageSize: z.number().int().min(1).max(1000).optional(),
965
- maxPages: z.number().int().min(1).max(1000).optional(),
966
- all: z.boolean().optional(),
967
- fields: z.string().min(1).optional(),
968
- });
969
- return runTool(
970
- 'list_queued_builds',
971
- schema,
972
- async (typed) => {
973
- const api = TeamCityAPI.getInstance();
974
- const baseParts: string[] = [];
975
- if (typed.locator) baseParts.push(typed.locator);
976
- const pageSize = typed.pageSize ?? 100;
977
-
978
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
979
- const parts = [...baseParts];
980
- if (typeof count === 'number') parts.push(`count:${count}`);
981
- if (typeof start === 'number') parts.push(`start:${start}`);
982
- const locator = parts.length > 0 ? parts.join(',') : undefined;
983
- return api.buildQueue.getAllQueuedBuilds(locator as string | undefined, typed.fields);
984
- };
985
-
986
- const fetcher = createPaginatedFetcher(
987
- baseFetch,
988
- (response: unknown) => {
989
- const data = response as { build?: unknown[]; count?: number };
990
- return Array.isArray(data.build) ? (data.build as unknown[]) : [];
991
- },
992
- (response: unknown) => {
993
- const data = response as { count?: number };
994
- return typeof data.count === 'number' ? data.count : undefined;
995
- }
996
- );
997
-
998
- if (typed.all) {
999
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
1000
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
1001
- }
1002
-
1003
- const firstPage = await fetcher({ count: pageSize, start: 0 });
1004
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
1005
- },
1006
- args
1007
- );
1008
- },
1009
- },
1010
-
1011
- // === Server Health & Metrics (read-only) ===
1012
- {
1013
- name: 'get_server_metrics',
1014
- description: 'Fetch server metrics (CPU/memory/disk/load) if available',
1015
- inputSchema: { type: 'object', properties: {} },
1016
- handler: async (_args: unknown) => {
1017
- return runTool(
1018
- 'get_server_metrics',
1019
- null,
1020
- async () => {
1021
- const api = TeamCityAPI.getInstance();
1022
- const metrics = await api.server.getAllMetrics();
1023
- return json(metrics.data);
1024
- },
1025
- {}
1026
- );
1027
- },
1028
- mode: 'full',
1029
- },
1030
- {
1031
- name: 'get_server_info',
1032
- description: 'Get TeamCity server info (version, build number, state)',
1033
- inputSchema: { type: 'object', properties: {} },
1034
- handler: async (_args: unknown) => {
1035
- return runTool(
1036
- 'get_server_info',
1037
- null,
1038
- async () => {
1039
- const api = TeamCityAPI.getInstance();
1040
- const info = await api.server.getServerInfo();
1041
- return json(info.data);
1042
- },
1043
- {}
1044
- );
1045
- },
1046
- },
1047
- {
1048
- name: 'list_server_health_items',
1049
- description: 'List server health items (warnings/errors) for readiness checks',
1050
- inputSchema: {
1051
- type: 'object',
1052
- properties: {
1053
- locator: { type: 'string', description: 'Optional health item locator filter' },
1054
- },
1055
- },
1056
- handler: async (args: unknown) => {
1057
- const schema = z.object({ locator: z.string().min(1).optional() });
1058
- return runTool(
1059
- 'list_server_health_items',
1060
- schema,
1061
- async (typed) => {
1062
- const api = TeamCityAPI.getInstance();
1063
- const response = await api.health.getHealthItems(typed.locator);
1064
- return json(response.data);
1065
- },
1066
- args
1067
- );
1068
- },
1069
- mode: 'full',
1070
- },
1071
- {
1072
- name: 'get_server_health_item',
1073
- description: 'Get a single server health item by locator',
1074
- inputSchema: {
1075
- type: 'object',
1076
- properties: { locator: { type: 'string', description: 'Health item locator' } },
1077
- required: ['locator'],
1078
- },
1079
- handler: async (args: unknown) => {
1080
- const schema = z.object({ locator: z.string().min(1) });
1081
- return runTool(
1082
- 'get_server_health_item',
1083
- schema,
1084
- async (typed) => {
1085
- const api = TeamCityAPI.getInstance();
1086
- const response = await api.health.getSingleHealthItem(typed.locator);
1087
- return json(response.data);
1088
- },
1089
- args
1090
- );
1091
- },
1092
- mode: 'full',
1093
- },
1094
-
1095
- // === Availability Policy Guard (read-only) ===
1096
- {
1097
- name: 'check_availability_guard',
1098
- description:
1099
- 'Evaluate server health; returns ok=false if critical health items found (severity ERROR)',
1100
- inputSchema: {
1101
- type: 'object',
1102
- properties: {
1103
- failOnWarning: {
1104
- type: 'boolean',
1105
- description: 'Treat warnings as failures (default false)',
1106
- },
1107
- },
1108
- },
1109
- handler: async (args: unknown) => {
1110
- const schema = z.object({ failOnWarning: z.boolean().optional() });
1111
- return runTool(
1112
- 'check_availability_guard',
1113
- schema,
1114
- async (typed) => {
1115
- const api = TeamCityAPI.getInstance();
1116
- const resp = await api.health.getHealthItems();
1117
- const items = (resp.data?.healthItem ?? []) as Array<{
1118
- severity?: 'ERROR' | 'WARNING' | 'INFO' | string;
1119
- id?: string;
1120
- category?: string;
1121
- additionalData?: unknown;
1122
- href?: string;
1123
- text?: string;
1124
- }>;
1125
- const critical = items.filter((i) => i.severity === 'ERROR');
1126
- const warnings = items.filter((i) => i.severity === 'WARNING');
1127
- const ok = critical.length === 0 && (!typed.failOnWarning || warnings.length === 0);
1128
- return json({ ok, criticalCount: critical.length, warningCount: warnings.length, items });
1129
- },
1130
- args
1131
- );
1132
- },
1133
- },
1134
-
1135
- // === Agent Compatibility (read-only lookups) ===
1136
- {
1137
- name: 'get_compatible_build_types_for_agent',
1138
- description: 'Get build types compatible with the specified agent',
1139
- inputSchema: {
1140
- type: 'object',
1141
- properties: { agentId: { type: 'string', description: 'Agent ID' } },
1142
- required: ['agentId'],
1143
- },
1144
- handler: async (args: unknown) => {
1145
- const schema = z.object({ agentId: z.string().min(1) });
1146
- return runTool(
1147
- 'get_compatible_build_types_for_agent',
1148
- schema,
1149
- async (typed) => {
1150
- const api = TeamCityAPI.getInstance();
1151
- const resp = await api.agents.getCompatibleBuildTypes(typed.agentId);
1152
- return json(resp.data);
1153
- },
1154
- args
1155
- );
1156
- },
1157
- },
1158
- {
1159
- name: 'get_incompatible_build_types_for_agent',
1160
- description: 'Get build types incompatible with the specified agent',
1161
- inputSchema: {
1162
- type: 'object',
1163
- properties: { agentId: { type: 'string', description: 'Agent ID' } },
1164
- required: ['agentId'],
1165
- },
1166
- handler: async (args: unknown) => {
1167
- const schema = z.object({ agentId: z.string().min(1) });
1168
- return runTool(
1169
- 'get_incompatible_build_types_for_agent',
1170
- schema,
1171
- async (typed) => {
1172
- const api = TeamCityAPI.getInstance();
1173
- const resp = await api.agents.getIncompatibleBuildTypes(typed.agentId);
1174
- return json(resp.data);
1175
- },
1176
- args
1177
- );
1178
- },
1179
- },
1180
- {
1181
- name: 'get_agent_enabled_info',
1182
- description: 'Get the enabled/disabled state for an agent, including comment and switch time',
1183
- inputSchema: {
1184
- type: 'object',
1185
- properties: { agentId: { type: 'string', description: 'Agent ID' } },
1186
- required: ['agentId'],
1187
- },
1188
- handler: async (args: unknown) => {
1189
- const schema = z.object({ agentId: z.string().min(1) });
1190
- return runTool(
1191
- 'get_agent_enabled_info',
1192
- schema,
1193
- async (typed) => {
1194
- const api = TeamCityAPI.getInstance();
1195
- const resp = await api.agents.getEnabledInfo(typed.agentId);
1196
- return json(resp.data);
1197
- },
1198
- args
1199
- );
1200
- },
1201
- },
1202
- {
1203
- name: 'get_compatible_agents_for_build_type',
1204
- description: 'List agents compatible with a build type (optionally filter enabled only)',
1205
- inputSchema: {
1206
- type: 'object',
1207
- properties: {
1208
- buildTypeId: { type: 'string', description: 'Build type ID' },
1209
- includeDisabled: {
1210
- type: 'boolean',
1211
- description: 'Include disabled agents (default false)',
1212
- },
1213
- },
1214
- required: ['buildTypeId'],
1215
- },
1216
- handler: async (args: unknown) => {
1217
- const schema = z.object({
1218
- buildTypeId: z.string().min(1),
1219
- includeDisabled: z.boolean().optional(),
1220
- });
1221
- return runTool(
1222
- 'get_compatible_agents_for_build_type',
1223
- schema,
1224
- async (typed) => {
1225
- const api = TeamCityAPI.getInstance();
1226
- const filters = [`compatible:(buildType:${typed.buildTypeId})`];
1227
- if (!typed.includeDisabled) filters.push('enabled:true');
1228
- const locator = filters.join(',');
1229
- const resp = await api.agents.getAllAgents(locator);
1230
- return json(resp.data);
1231
- },
1232
- args
1233
- );
1234
- },
1235
- },
1236
- {
1237
- name: 'count_compatible_agents_for_build_type',
1238
- description: 'Return only the count of enabled compatible agents for a build type',
1239
- inputSchema: {
1240
- type: 'object',
1241
- properties: {
1242
- buildTypeId: { type: 'string', description: 'Build type ID' },
1243
- includeDisabled: {
1244
- type: 'boolean',
1245
- description: 'Include disabled agents (default false)',
1246
- },
1247
- },
1248
- required: ['buildTypeId'],
1249
- },
1250
- handler: async (args: unknown) => {
1251
- const schema = z.object({
1252
- buildTypeId: z.string().min(1),
1253
- includeDisabled: z.boolean().optional(),
1254
- });
1255
- return runTool(
1256
- 'count_compatible_agents_for_build_type',
1257
- schema,
1258
- async (typed) => {
1259
- const api = TeamCityAPI.getInstance();
1260
- const parts = [`compatible:(buildType:${typed.buildTypeId})`];
1261
- if (!typed.includeDisabled) parts.push('enabled:true');
1262
- const locator = parts.join(',');
1263
- const resp = await api.agents.getAllAgents(locator, 'count');
1264
- const count = (resp.data as { count?: number }).count ?? 0;
1265
- return json({ count });
1266
- },
1267
- args
1268
- );
1269
- },
1270
- },
1271
- {
1272
- name: 'get_compatible_agents_for_queued_build',
1273
- description:
1274
- 'List agents compatible with a queued/running build by buildId (optionally filter enabled only)',
1275
- inputSchema: {
1276
- type: 'object',
1277
- properties: {
1278
- buildId: { type: 'string', description: 'Build ID' },
1279
- includeDisabled: {
1280
- type: 'boolean',
1281
- description: 'Include disabled agents (default false)',
1282
- },
1283
- },
1284
- required: ['buildId'],
1285
- },
1286
- handler: async (args: unknown) => {
1287
- const schema = z.object({
1288
- buildId: z.string().min(1),
1289
- includeDisabled: z.boolean().optional(),
1290
- });
1291
- return runTool(
1292
- 'get_compatible_agents_for_queued_build',
1293
- schema,
1294
- async (typed) => {
1295
- const api = TeamCityAPI.getInstance();
1296
- const build = await api.getBuild(typed.buildId);
1297
- const buildTypeId = (build as { buildTypeId?: string }).buildTypeId;
1298
- if (!buildTypeId) return json({ items: [], count: 0, note: 'Build type ID not found' });
1299
- const parts = [`compatible:(buildType:${buildTypeId})`];
1300
- if (!typed.includeDisabled) parts.push('enabled:true');
1301
- const locator = parts.join(',');
1302
- const resp = await api.agents.getAllAgents(locator);
1303
- return json(resp.data);
1304
- },
1305
- args
1306
- );
1307
- },
1308
- },
1309
- {
1310
- name: 'check_teamcity_connection',
1311
- description: 'Check connectivity to TeamCity server and basic readiness',
1312
- inputSchema: { type: 'object', properties: {} },
1313
- handler: async (_args: unknown) => {
1314
- const ok = await TeamCityAPI.getInstance().testConnection();
1315
- return json({ ok });
1316
- },
1317
- },
1318
-
1319
- // === Agent Tools ===
1320
- {
1321
- name: 'list_agents',
1322
- description: 'List build agents (supports pagination)',
1323
- inputSchema: {
1324
- type: 'object',
1325
- properties: {
1326
- locator: { type: 'string', description: 'Optional agent locator to filter' },
1327
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
1328
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
1329
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
1330
- fields: {
1331
- type: 'string',
1332
- description: 'Optional fields selector for server-side projection',
1333
- },
1334
- },
1335
- },
1336
- handler: async (args: unknown) => {
1337
- const schema = z.object({
1338
- locator: z.string().min(1).optional(),
1339
- pageSize: z.number().int().min(1).max(1000).optional(),
1340
- maxPages: z.number().int().min(1).max(1000).optional(),
1341
- all: z.boolean().optional(),
1342
- fields: z.string().min(1).optional(),
1343
- });
1344
- return runTool(
1345
- 'list_agents',
1346
- schema,
1347
- async (typed) => {
1348
- const api = TeamCityAPI.getInstance();
1349
- const pageSize = typed.pageSize ?? 100;
1350
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
1351
- const parts: string[] = [];
1352
- if (typed.locator) parts.push(typed.locator);
1353
- if (typeof count === 'number') parts.push(`count:${count}`);
1354
- if (typeof start === 'number') parts.push(`start:${start}`);
1355
- const locator = parts.length > 0 ? parts.join(',') : undefined;
1356
- return api.agents.getAllAgents(locator as string | undefined, typed.fields);
1357
- };
1358
-
1359
- const fetcher = createPaginatedFetcher(
1360
- baseFetch,
1361
- (response: unknown) => {
1362
- const data = response as { agent?: unknown[]; count?: number };
1363
- return Array.isArray(data.agent) ? (data.agent as unknown[]) : [];
1364
- },
1365
- (response: unknown) => {
1366
- const data = response as { count?: number };
1367
- return typeof data.count === 'number' ? data.count : undefined;
1368
- }
1369
- );
1370
-
1371
- if (typed.all) {
1372
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
1373
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
1374
- }
1375
-
1376
- const firstPage = await fetcher({ count: pageSize, start: 0 });
1377
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
1378
- },
1379
- args
1380
- );
1381
- },
1382
- },
1383
-
1384
- {
1385
- name: 'list_agent_pools',
1386
- description: 'List agent pools (supports pagination)',
1387
- inputSchema: {
1388
- type: 'object',
1389
- properties: {
1390
- pageSize: { type: 'number', description: 'Items per page (default 100)' },
1391
- maxPages: { type: 'number', description: 'Max pages to fetch (when all=true)' },
1392
- all: { type: 'boolean', description: 'Fetch all pages up to maxPages' },
1393
- fields: {
1394
- type: 'string',
1395
- description: 'Optional fields selector for server-side projection',
1396
- },
1397
- },
1398
- },
1399
- handler: async (args: unknown) => {
1400
- const schema = z.object({
1401
- pageSize: z.number().int().min(1).max(1000).optional(),
1402
- maxPages: z.number().int().min(1).max(1000).optional(),
1403
- all: z.boolean().optional(),
1404
- fields: z.string().min(1).optional(),
1405
- });
1406
- return runTool(
1407
- 'list_agent_pools',
1408
- schema,
1409
- async (typed) => {
1410
- const api = TeamCityAPI.getInstance();
1411
- const pageSize = typed.pageSize ?? 100;
1412
- const baseFetch = async ({ count, start }: { count?: number; start?: number }) => {
1413
- const parts: string[] = [];
1414
- if (typeof count === 'number') parts.push(`count:${count}`);
1415
- if (typeof start === 'number') parts.push(`start:${start}`);
1416
- const locator = parts.length > 0 ? parts.join(',') : undefined;
1417
- return api.agentPools.getAllAgentPools(locator as string | undefined, typed.fields);
1418
- };
1419
-
1420
- const fetcher = createPaginatedFetcher(
1421
- baseFetch,
1422
- (response: unknown) => {
1423
- const data = response as { agentPool?: unknown[]; count?: number };
1424
- return Array.isArray(data.agentPool) ? (data.agentPool as unknown[]) : [];
1425
- },
1426
- (response: unknown) => {
1427
- const data = response as { count?: number };
1428
- return typeof data.count === 'number' ? data.count : undefined;
1429
- }
1430
- );
1431
-
1432
- if (typed.all) {
1433
- const items = await fetchAllPages(fetcher, { pageSize, maxPages: typed.maxPages });
1434
- return json({ items, pagination: { mode: 'all', pageSize, fetched: items.length } });
1435
- }
1436
-
1437
- const firstPage = await fetcher({ count: pageSize, start: 0 });
1438
- return json({ items: firstPage.items, pagination: { page: 1, pageSize } });
1439
- },
1440
- args
1441
- );
1442
- },
1443
- },
1444
-
1445
- // === Additional Tools from Complex Implementation ===
1446
-
1447
- // Build Analysis Tools
1448
- {
1449
- name: 'get_build_results',
1450
- description:
1451
- 'Get detailed results of a build including tests, artifacts, changes, and statistics',
1452
- inputSchema: {
1453
- type: 'object',
1454
- properties: {
1455
- buildId: { type: 'string', description: 'Build ID' },
1456
- includeArtifacts: {
1457
- type: 'boolean',
1458
- description: 'Include artifacts listing and metadata',
1459
- },
1460
- includeStatistics: { type: 'boolean', description: 'Include build statistics' },
1461
- includeChanges: { type: 'boolean', description: 'Include VCS changes' },
1462
- includeDependencies: { type: 'boolean', description: 'Include dependency builds' },
1463
- artifactFilter: { type: 'string', description: 'Filter artifacts by name/path pattern' },
1464
- maxArtifactSize: {
1465
- type: 'number',
1466
- description: 'Max artifact content size (bytes) when inlining',
1467
- },
1468
- },
1469
- required: ['buildId'],
1470
- },
1471
- handler: async (args: unknown) => {
1472
- const schema = z.object({
1473
- buildId: z.string().min(1),
1474
- includeArtifacts: z.boolean().optional(),
1475
- includeStatistics: z.boolean().optional(),
1476
- includeChanges: z.boolean().optional(),
1477
- includeDependencies: z.boolean().optional(),
1478
- artifactFilter: z.string().min(1).optional(),
1479
- maxArtifactSize: z.number().int().min(1).optional(),
1480
- });
1481
-
1482
- return runTool(
1483
- 'get_build_results',
1484
- schema,
1485
- async (typed) => {
1486
- // Use the manager for rich results via the unified TeamCityAPI adapter.
1487
- const api = TeamCityAPI.getInstance();
1488
- const manager = new BuildResultsManager(createAdapterFromTeamCityAPI(api));
1489
- const result = await manager.getBuildResults(typed.buildId, {
1490
- includeArtifacts: typed.includeArtifacts,
1491
- includeStatistics: typed.includeStatistics,
1492
- includeChanges: typed.includeChanges,
1493
- includeDependencies: typed.includeDependencies,
1494
- artifactFilter: typed.artifactFilter,
1495
- maxArtifactSize: typed.maxArtifactSize,
1496
- });
1497
- return json(result);
1498
- },
1499
- args
1500
- );
1501
- },
1502
- },
1503
-
1504
- {
1505
- name: 'get_test_details',
1506
- description: 'Get detailed information about test failures',
1507
- inputSchema: {
1508
- type: 'object',
1509
- properties: {
1510
- buildId: { type: 'string', description: 'Build ID' },
1511
- testNameId: { type: 'string', description: 'Test name ID (optional)' },
1512
- },
1513
- required: ['buildId'],
1514
- },
1515
- handler: async (args: unknown) => {
1516
- const schema = z.object({
1517
- buildId: z.string().min(1),
1518
- testNameId: z.string().min(1).optional(),
1519
- });
1520
- return runTool(
1521
- 'get_test_details',
1522
- schema,
1523
- async (typed) => {
1524
- const api = TeamCityAPI.getInstance();
1525
- let locator = `build:(id:${typed.buildId})`;
1526
- if (typed.testNameId) locator += `,test:(id:${typed.testNameId})`;
1527
- const response = await api.tests.getAllTestOccurrences(locator);
1528
- return json(response.data);
1529
- },
1530
- args
1531
- );
1532
- },
1533
- },
1534
-
1535
- {
1536
- name: 'analyze_build_problems',
1537
- description: 'Analyze and report build problems and failures',
1538
- inputSchema: {
1539
- type: 'object',
1540
- properties: {
1541
- buildId: { type: 'string', description: 'Build ID to analyze' },
1542
- },
1543
- required: ['buildId'],
1544
- },
1545
- handler: async (args: unknown) => {
1546
- const schema = z.object({ buildId: z.string().min(1) });
1547
- return runTool(
1548
- 'analyze_build_problems',
1549
- schema,
1550
- async (typed) => {
1551
- const api = TeamCityAPI.getInstance();
1552
- const build = await api.getBuild(typed.buildId);
1553
- const problems = await api.builds.getBuildProblems(typed.buildId);
1554
- const failures = await api.listTestFailures(typed.buildId);
1555
- return json({
1556
- buildStatus: build.status,
1557
- statusText: build.statusText,
1558
- problems: problems.data,
1559
- testFailures: failures,
1560
- });
1561
- },
1562
- args
1563
- );
1564
- },
1565
- },
1566
-
1567
- {
1568
- name: 'list_branches',
1569
- description: 'List branches for a project or build configuration',
1570
- inputSchema: {
1571
- type: 'object',
1572
- properties: {
1573
- projectId: { type: 'string', description: 'Project ID' },
1574
- buildTypeId: { type: 'string', description: 'Build type ID' },
1575
- },
1576
- },
1577
- handler: async (args: unknown) => {
1578
- const schema = z
1579
- .object({
1580
- projectId: z.string().min(1).optional(),
1581
- buildTypeId: z.string().min(1).optional(),
1582
- })
1583
- .refine((v) => Boolean(v.projectId ?? v.buildTypeId), {
1584
- message: 'Either projectId or buildTypeId is required',
1585
- path: ['projectId'],
1586
- });
1587
- return runTool(
1588
- 'list_branches',
1589
- schema,
1590
- async (typed) => {
1591
- const api = TeamCityAPI.getInstance();
1592
- const locator = typed.buildTypeId
1593
- ? `buildType:(id:${typed.buildTypeId})`
1594
- : `project:(id:${typed.projectId})`;
1595
-
1596
- const builds = (await api.listBuilds(`${locator},count:100}`)) as {
1597
- build?: Array<{ branchName?: string | null }>; // minimal shape used
1598
- };
1599
- const items = Array.isArray(builds.build) ? builds.build : [];
1600
- const branchNames = items
1601
- .map((b) => b.branchName)
1602
- .filter((n): n is string => typeof n === 'string' && n.length > 0);
1603
- const branches = new Set(branchNames);
1604
- return json({ branches: Array.from(branches), count: branches.size });
1605
- },
1606
- args
1607
- );
1608
- },
1609
- },
1610
-
1611
- {
1612
- name: 'list_parameters',
1613
- description: 'List parameters for a build configuration',
1614
- inputSchema: {
1615
- type: 'object',
1616
- properties: {
1617
- buildTypeId: { type: 'string', description: 'Build type ID' },
1618
- },
1619
- required: ['buildTypeId'],
1620
- },
1621
- handler: async (args: unknown) => {
1622
- const schema = z.object({ buildTypeId: z.string().min(1) });
1623
- return runTool(
1624
- 'list_parameters',
1625
- schema,
1626
- async (typed) => {
1627
- const api = TeamCityAPI.getInstance();
1628
- const buildType = await api.getBuildType(typed.buildTypeId);
1629
- return json({
1630
- parameters: buildType.parameters?.property ?? [],
1631
- count: buildType.parameters?.property?.length ?? 0,
1632
- });
1633
- },
1634
- args
1635
- );
1636
- },
1637
- },
1638
-
1639
- {
1640
- name: 'list_project_hierarchy',
1641
- description: 'List project hierarchy showing parent-child relationships',
1642
- inputSchema: {
1643
- type: 'object',
1644
- properties: {
1645
- rootProjectId: { type: 'string', description: 'Root project ID (defaults to _Root)' },
1646
- },
1647
- },
1648
- handler: async (args: unknown) => {
1649
- const schema = z.object({ rootProjectId: z.string().min(1).optional() });
1650
- return runTool(
1651
- 'list_project_hierarchy',
1652
- schema,
1653
- async (typed) => {
1654
- const api = TeamCityAPI.getInstance();
1655
- const rootId = typed.rootProjectId ?? '_Root';
1656
-
1657
- type ApiProject = {
1658
- id?: string;
1659
- name?: string;
1660
- parentProjectId?: string;
1661
- projects?: { project?: unknown[] };
1662
- };
1663
-
1664
- async function buildHierarchy(
1665
- projectId: string,
1666
- depth = 0
1667
- ): Promise<{
1668
- id?: string;
1669
- name?: string;
1670
- parentId?: string;
1671
- children: Array<{ id: string; name?: string }>;
1672
- }> {
1673
- const response = await api.projects.getProject(projectId);
1674
- const project = response.data as ApiProject;
1675
- const children: Array<{ id: string; name?: string }> = [];
1676
-
1677
- const maybeChildren = project.projects?.project ?? [];
1678
- if (Array.isArray(maybeChildren)) {
1679
- for (const childRaw of maybeChildren) {
1680
- const child = childRaw as { id?: string; name?: string };
1681
- if (typeof child.id === 'string' && depth < 3) {
1682
- // eslint-disable-next-line no-await-in-loop
1683
- const sub = await buildHierarchy(child.id, depth + 1);
1684
- children.push({ id: sub.id ?? child.id, name: sub.name });
1685
- } else if (typeof child.id === 'string') {
1686
- children.push({ id: child.id, name: child.name });
1687
- }
1688
- }
1689
- }
1690
-
1691
- return {
1692
- id: project.id,
1693
- name: project.name,
1694
- parentId: project.parentProjectId,
1695
- children,
1696
- };
1697
- }
1698
-
1699
- const hierarchy = await buildHierarchy(rootId);
1700
- return json(hierarchy);
1701
- },
1702
- args
1703
- );
1704
- },
1705
- },
1706
- ];
1707
-
1708
- /**
1709
- * Full mode tools - Write/modify operations (only in full mode)
1710
- */
1711
- const FULL_MODE_TOOLS: ToolDefinition[] = [
1712
- // === Project Management Tools ===
1713
- {
1714
- name: 'create_project',
1715
- description: 'Create a new TeamCity project',
1716
- inputSchema: {
1717
- type: 'object',
1718
- properties: {
1719
- name: { type: 'string', description: 'Project name' },
1720
- id: { type: 'string', description: 'Project ID' },
1721
- parentProjectId: { type: 'string', description: 'Parent project ID (defaults to _Root)' },
1722
- description: { type: 'string', description: 'Project description' },
1723
- },
1724
- required: ['name', 'id'],
1725
- },
1726
- handler: async (args: unknown) => {
1727
- const schema = z.object({
1728
- name: z.string().min(1),
1729
- id: z.string().min(1),
1730
- description: z.string().optional(),
1731
- parentProjectId: z.string().min(1).optional(),
1732
- });
1733
- return runTool(
1734
- 'create_project',
1735
- schema,
1736
- async (typedArgs) => {
1737
- const api = TeamCityAPI.getInstance();
1738
- const project = {
1739
- name: typedArgs.name,
1740
- id: typedArgs.id,
1741
- parentProject: { id: typedArgs.parentProjectId ?? '_Root' },
1742
- description: typedArgs.description,
1743
- };
1744
- const response = await api.projects.addProject(project, {
1745
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
1746
- });
1747
- return json({ success: true, action: 'create_project', id: response.data.id });
1748
- },
1749
- args
1750
- );
1751
- },
1752
- mode: 'full',
1753
- },
1754
-
1755
- {
1756
- name: 'delete_project',
1757
- description: 'Delete a TeamCity project',
1758
- inputSchema: {
1759
- type: 'object',
1760
- properties: {
1761
- projectId: { type: 'string', description: 'Project ID to delete' },
1762
- },
1763
- required: ['projectId'],
1764
- },
1765
- handler: async (args: unknown) => {
1766
- const typedArgs = args as DeleteProjectArgs;
1767
-
1768
- const api = TeamCityAPI.getInstance();
1769
- await api.projects.deleteProject(typedArgs.projectId);
1770
- return json({ success: true, action: 'delete_project', id: typedArgs.projectId });
1771
- },
1772
- mode: 'full',
1773
- },
1774
-
1775
- {
1776
- name: 'update_project_settings',
1777
- description: 'Update project settings and parameters',
1778
- inputSchema: {
1779
- type: 'object',
1780
- properties: {
1781
- projectId: { type: 'string', description: 'Project ID' },
1782
- name: { type: 'string', description: 'New project name' },
1783
- description: { type: 'string', description: 'New project description' },
1784
- archived: { type: 'boolean', description: 'Archive/unarchive project' },
1785
- },
1786
- required: ['projectId'],
1787
- },
1788
- handler: async (args: unknown) => {
1789
- const schema = z.object({
1790
- projectId: z.string().min(1),
1791
- name: z.string().min(1).optional(),
1792
- description: z.string().optional(),
1793
- archived: z.boolean().optional(),
1794
- });
1795
-
1796
- return runTool(
1797
- 'update_project_settings',
1798
- schema,
1799
- async (typedArgs) => {
1800
- const api = TeamCityAPI.getInstance();
1801
-
1802
- // Emit debug info about requested changes (avoid logging secrets)
1803
- debug('update_project_settings invoked', {
1804
- projectId: typedArgs.projectId,
1805
- // Only log which fields are present to reduce noise
1806
- requestedChanges: {
1807
- name: typeof typedArgs.name !== 'undefined',
1808
- description: typeof typedArgs.description !== 'undefined',
1809
- archived: typeof typedArgs.archived !== 'undefined',
1810
- },
1811
- });
1812
-
1813
- if (typedArgs.name) {
1814
- debug('Setting project field', {
1815
- projectId: typedArgs.projectId,
1816
- field: 'name',
1817
- valuePreview: typedArgs.name,
1818
- });
1819
- await api.projects.setProjectField(typedArgs.projectId, 'name', typedArgs.name);
1820
- }
1821
- if (typedArgs.description !== undefined) {
1822
- debug('Setting project field', {
1823
- projectId: typedArgs.projectId,
1824
- field: 'description',
1825
- valuePreview: typedArgs.description,
1826
- });
1827
- await api.projects.setProjectField(
1828
- typedArgs.projectId,
1829
- 'description',
1830
- typedArgs.description
1831
- );
1832
- }
1833
- if (typedArgs.archived !== undefined) {
1834
- debug('Setting project field', {
1835
- projectId: typedArgs.projectId,
1836
- field: 'archived',
1837
- valuePreview: String(typedArgs.archived),
1838
- });
1839
- await api.projects.setProjectField(
1840
- typedArgs.projectId,
1841
- 'archived',
1842
- String(typedArgs.archived)
1843
- );
1844
- }
1845
-
1846
- debug('Project settings updated', {
1847
- projectId: typedArgs.projectId,
1848
- appliedChanges: {
1849
- name: typedArgs.name ?? null,
1850
- description: typedArgs.description ?? null,
1851
- archived: typeof typedArgs.archived === 'boolean' ? typedArgs.archived : null,
1852
- },
1853
- });
1854
-
1855
- return json({
1856
- success: true,
1857
- action: 'update_project_settings',
1858
- id: typedArgs.projectId,
1859
- });
1860
- },
1861
- args
1862
- );
1863
- },
1864
- mode: 'full',
1865
- },
1866
-
1867
- // === Build Configuration Management ===
1868
- {
1869
- name: 'create_build_config',
1870
- description: 'Create a new build configuration',
1871
- inputSchema: {
1872
- type: 'object',
1873
- properties: {
1874
- projectId: { type: 'string', description: 'Project ID' },
1875
- name: { type: 'string', description: 'Build configuration name' },
1876
- id: { type: 'string', description: 'Build configuration ID' },
1877
- description: { type: 'string', description: 'Description' },
1878
- },
1879
- required: ['projectId', 'name', 'id'],
1880
- },
1881
- handler: async (args: unknown) => {
1882
- const typedArgs = args as CreateBuildConfigArgs;
1883
-
1884
- const api = TeamCityAPI.getInstance();
1885
- const buildType = {
1886
- name: typedArgs.name,
1887
- id: typedArgs.id,
1888
- project: { id: typedArgs.projectId },
1889
- description: typedArgs.description,
1890
- };
1891
- const response = await api.buildTypes.createBuildType(undefined, buildType, {
1892
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
1893
- });
1894
- return json({ success: true, action: 'create_build_config', id: response.data.id });
1895
- },
1896
- mode: 'full',
1897
- },
1898
-
1899
- {
1900
- name: 'clone_build_config',
1901
- description: 'Clone an existing build configuration',
1902
- inputSchema: {
1903
- type: 'object',
1904
- properties: {
1905
- sourceBuildTypeId: { type: 'string', description: 'Source build type ID' },
1906
- name: { type: 'string', description: 'New build configuration name' },
1907
- id: { type: 'string', description: 'New build configuration ID' },
1908
- projectId: { type: 'string', description: 'Target project ID' },
1909
- },
1910
- required: ['sourceBuildTypeId', 'name', 'id'],
1911
- },
1912
- handler: async (args: unknown) => {
1913
- const typedArgs = args as CloneBuildConfigArgs;
1914
-
1915
- const api = TeamCityAPI.getInstance();
1916
- // Get source build type
1917
- const source = await api.getBuildType(typedArgs.sourceBuildTypeId);
1918
-
1919
- // Create new build type based on source
1920
- const buildType = {
1921
- ...source,
1922
- name: typedArgs.name,
1923
- id: typedArgs.id,
1924
- project: { id: typedArgs.projectId ?? source.project?.id ?? '_Root' },
1925
- };
1926
-
1927
- const response = await api.buildTypes.createBuildType(undefined, buildType);
1928
- return json({ success: true, action: 'clone_build_config', id: response.data.id });
1929
- },
1930
- mode: 'full',
1931
- },
1932
-
1933
- {
1934
- name: 'update_build_config',
1935
- description: 'Update build configuration settings',
1936
- inputSchema: {
1937
- type: 'object',
1938
- properties: {
1939
- buildTypeId: { type: 'string', description: 'Build type ID' },
1940
- name: { type: 'string', description: 'New name' },
1941
- description: { type: 'string', description: 'New description' },
1942
- paused: { type: 'boolean', description: 'Pause/unpause configuration' },
1943
- artifactRules: { type: 'string', description: 'Artifact rules' },
1944
- },
1945
- required: ['buildTypeId'],
1946
- },
1947
- handler: async (args: unknown) => {
1948
- const typedArgs = args as UpdateBuildConfigArgs;
1949
-
1950
- const api = TeamCityAPI.getInstance();
1951
-
1952
- if (typedArgs.name != null && typedArgs.name !== '') {
1953
- await api.buildTypes.setBuildTypeField(typedArgs.buildTypeId, 'name', typedArgs.name);
1954
- }
1955
- if (typedArgs.description !== undefined) {
1956
- await api.buildTypes.setBuildTypeField(
1957
- typedArgs.buildTypeId,
1958
- 'description',
1959
- typedArgs.description
1960
- );
1961
- }
1962
- if (typedArgs.paused !== undefined) {
1963
- await api.buildTypes.setBuildTypeField(
1964
- typedArgs.buildTypeId,
1965
- 'paused',
1966
- String(typedArgs.paused)
1967
- );
1968
- }
1969
- if (typedArgs.artifactRules !== undefined) {
1970
- await api.buildTypes.setBuildTypeField(
1971
- typedArgs.buildTypeId,
1972
- 'artifactRules',
1973
- typedArgs.artifactRules
1974
- );
1975
- }
1976
-
1977
- return json({ success: true, action: 'update_build_config', id: typedArgs.buildTypeId });
1978
- },
1979
- mode: 'full',
1980
- },
1981
-
1982
- // === VCS attachment ===
1983
- {
1984
- name: 'add_vcs_root_to_build',
1985
- description: 'Attach a VCS root to a build configuration',
1986
- inputSchema: {
1987
- type: 'object',
1988
- properties: {
1989
- buildTypeId: { type: 'string', description: 'Build type ID' },
1990
- vcsRootId: { type: 'string', description: 'VCS root ID' },
1991
- checkoutRules: { type: 'string', description: 'Optional checkout rules' },
1992
- },
1993
- required: ['buildTypeId', 'vcsRootId'],
1994
- },
1995
- handler: async (args: unknown) => {
1996
- const schema = z.object({
1997
- buildTypeId: z.string().min(1),
1998
- vcsRootId: z.string().min(1),
1999
- checkoutRules: z.string().optional(),
2000
- });
2001
- return runTool(
2002
- 'add_vcs_root_to_build',
2003
- schema,
2004
- async (typed) => {
2005
- const api = TeamCityAPI.getInstance();
2006
- const body = {
2007
- 'vcs-root': { id: typed.vcsRootId },
2008
- 'checkout-rules': typed.checkoutRules,
2009
- } as Record<string, unknown>;
2010
- await api.buildTypes.addVcsRootToBuildType(typed.buildTypeId, undefined, body, {
2011
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2012
- });
2013
- return json({
2014
- success: true,
2015
- action: 'add_vcs_root_to_build',
2016
- buildTypeId: typed.buildTypeId,
2017
- vcsRootId: typed.vcsRootId,
2018
- });
2019
- },
2020
- args
2021
- );
2022
- },
2023
- mode: 'full',
2024
- },
2025
-
2026
- // === Parameter Management ===
2027
- {
2028
- name: 'add_parameter',
2029
- description: 'Add a parameter to a build configuration',
2030
- inputSchema: {
2031
- type: 'object',
2032
- properties: {
2033
- buildTypeId: { type: 'string', description: 'Build type ID' },
2034
- name: { type: 'string', description: 'Parameter name' },
2035
- value: { type: 'string', description: 'Parameter value' },
2036
- },
2037
- required: ['buildTypeId', 'name', 'value'],
2038
- },
2039
- handler: async (args: unknown) => {
2040
- const typedArgs = args as AddParameterArgs;
2041
-
2042
- const api = TeamCityAPI.getInstance();
2043
- const parameter = {
2044
- name: typedArgs.name,
2045
- value: typedArgs.value,
2046
- };
2047
- await api.buildTypes.createBuildParameterOfBuildType(
2048
- typedArgs.buildTypeId,
2049
- undefined,
2050
- parameter,
2051
- { headers: { 'Content-Type': 'application/json', Accept: 'application/json' } }
2052
- );
2053
- return json({
2054
- success: true,
2055
- action: 'add_parameter',
2056
- buildTypeId: typedArgs.buildTypeId,
2057
- name: typedArgs.name,
2058
- });
2059
- },
2060
- mode: 'full',
2061
- },
2062
-
2063
- {
2064
- name: 'update_parameter',
2065
- description: 'Update a build configuration parameter',
2066
- inputSchema: {
2067
- type: 'object',
2068
- properties: {
2069
- buildTypeId: { type: 'string', description: 'Build type ID' },
2070
- name: { type: 'string', description: 'Parameter name' },
2071
- value: { type: 'string', description: 'New parameter value' },
2072
- },
2073
- required: ['buildTypeId', 'name', 'value'],
2074
- },
2075
- handler: async (args: unknown) => {
2076
- const typedArgs = args as UpdateParameterArgs;
2077
-
2078
- const api = TeamCityAPI.getInstance();
2079
- await api.buildTypes.updateBuildParameterOfBuildType(
2080
- typedArgs.name,
2081
- typedArgs.buildTypeId,
2082
- undefined,
2083
- {
2084
- name: typedArgs.name,
2085
- value: typedArgs.value,
2086
- },
2087
- { headers: { 'Content-Type': 'application/json', Accept: 'application/json' } }
2088
- );
2089
- return json({
2090
- success: true,
2091
- action: 'update_parameter',
2092
- buildTypeId: typedArgs.buildTypeId,
2093
- name: typedArgs.name,
2094
- });
2095
- },
2096
- mode: 'full',
2097
- },
2098
-
2099
- {
2100
- name: 'delete_parameter',
2101
- description: 'Delete a parameter from a build configuration',
2102
- inputSchema: {
2103
- type: 'object',
2104
- properties: {
2105
- buildTypeId: { type: 'string', description: 'Build type ID' },
2106
- name: { type: 'string', description: 'Parameter name' },
2107
- },
2108
- required: ['buildTypeId', 'name'],
2109
- },
2110
- handler: async (args: unknown) => {
2111
- const typedArgs = args as DeleteParameterArgs;
2112
-
2113
- const api = TeamCityAPI.getInstance();
2114
- await api.buildTypes.deleteBuildParameterOfBuildType(typedArgs.buildTypeId, typedArgs.name);
2115
- return json({
2116
- success: true,
2117
- action: 'delete_parameter',
2118
- buildTypeId: typedArgs.buildTypeId,
2119
- name: typedArgs.name,
2120
- });
2121
- },
2122
- mode: 'full',
2123
- },
2124
-
2125
- // === VCS Root Management ===
2126
- {
2127
- name: 'create_vcs_root',
2128
- description: 'Create a new VCS root',
2129
- inputSchema: {
2130
- type: 'object',
2131
- properties: {
2132
- projectId: { type: 'string', description: 'Project ID' },
2133
- name: { type: 'string', description: 'VCS root name' },
2134
- id: { type: 'string', description: 'VCS root ID' },
2135
- vcsName: { type: 'string', description: 'VCS type (e.g., jetbrains.git)' },
2136
- url: { type: 'string', description: 'Repository URL' },
2137
- branch: { type: 'string', description: 'Default branch' },
2138
- },
2139
- required: ['projectId', 'name', 'id', 'vcsName', 'url'],
2140
- },
2141
- handler: async (args: unknown) => {
2142
- const typedArgs = args as CreateVCSRootArgs;
2143
-
2144
- const api = TeamCityAPI.getInstance();
2145
- const vcsRoot = {
2146
- name: typedArgs.name,
2147
- id: typedArgs.id,
2148
- vcsName: typedArgs.vcsName,
2149
- project: { id: typedArgs.projectId },
2150
- properties: {
2151
- property: [
2152
- { name: 'url', value: typedArgs.url },
2153
- { name: 'branch', value: typedArgs.branch ?? 'refs/heads/master' },
2154
- ],
2155
- },
2156
- };
2157
- const response = await api.vcsRoots.addVcsRoot(undefined, vcsRoot, {
2158
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2159
- });
2160
- return json({ success: true, action: 'create_vcs_root', id: response.data.id });
2161
- },
2162
- mode: 'full',
2163
- },
2164
-
2165
- // === Agent Management ===
2166
- {
2167
- name: 'authorize_agent',
2168
- description: 'Authorize or unauthorize a build agent',
2169
- inputSchema: {
2170
- type: 'object',
2171
- properties: {
2172
- agentId: { type: 'string', description: 'Agent ID' },
2173
- authorize: { type: 'boolean', description: 'true to authorize, false to unauthorize' },
2174
- },
2175
- required: ['agentId', 'authorize'],
2176
- },
2177
- handler: async (args: unknown) => {
2178
- const typedArgs = args as AuthorizeAgentArgs;
2179
-
2180
- const api = TeamCityAPI.getInstance();
2181
- await api.agents.setAgentField(
2182
- typedArgs.agentId,
2183
- 'authorized',
2184
- typedArgs.authorize ? 'true' : 'false'
2185
- );
2186
- return json({
2187
- success: true,
2188
- action: 'authorize_agent',
2189
- agentId: typedArgs.agentId,
2190
- authorized: typedArgs.authorize,
2191
- });
2192
- },
2193
- mode: 'full',
2194
- },
2195
-
2196
- {
2197
- name: 'assign_agent_to_pool',
2198
- description: 'Assign an agent to a different pool',
2199
- inputSchema: {
2200
- type: 'object',
2201
- properties: {
2202
- agentId: { type: 'string', description: 'Agent ID' },
2203
- poolId: { type: 'string', description: 'Agent pool ID' },
2204
- },
2205
- required: ['agentId', 'poolId'],
2206
- },
2207
- handler: async (args: unknown) => {
2208
- const typedArgs = args as AssignAgentToPoolArgs;
2209
-
2210
- const api = TeamCityAPI.getInstance();
2211
- await api.agents.setAgentPool(typedArgs.agentId, undefined, {
2212
- id: parseInt(typedArgs.poolId),
2213
- });
2214
- return json({
2215
- success: true,
2216
- action: 'assign_agent_to_pool',
2217
- agentId: typedArgs.agentId,
2218
- poolId: typedArgs.poolId,
2219
- });
2220
- },
2221
- mode: 'full',
2222
- },
2223
-
2224
- // === Build Step Management ===
2225
- {
2226
- name: 'manage_build_steps',
2227
- description: 'Add, update, or delete build steps',
2228
- inputSchema: {
2229
- type: 'object',
2230
- properties: {
2231
- buildTypeId: { type: 'string', description: 'Build type ID' },
2232
- action: {
2233
- type: 'string',
2234
- enum: ['add', 'update', 'delete'],
2235
- description: 'Action to perform',
2236
- },
2237
- stepId: { type: 'string', description: 'Step ID (for update/delete)' },
2238
- name: { type: 'string', description: 'Step name' },
2239
- type: { type: 'string', description: 'Step type (e.g., simpleRunner)' },
2240
- properties: { type: 'object', description: 'Step properties' },
2241
- },
2242
- required: ['buildTypeId', 'action'],
2243
- },
2244
- handler: async (args: unknown) => {
2245
- const typedArgs = args as ManageBuildStepsArgs;
2246
-
2247
- const api = TeamCityAPI.getInstance();
2248
-
2249
- switch (typedArgs.action) {
2250
- case 'add': {
2251
- const stepProps: Record<string, string> = Object.fromEntries(
2252
- Object.entries(typedArgs.properties ?? {}).map(([k, v]) => [k, String(v)])
2253
- );
2254
- // Ensure command runner uses custom script when script.content is provided
2255
- if (typedArgs.type === 'simpleRunner' && stepProps['script.content']) {
2256
- stepProps['use.custom.script'] = stepProps['use.custom.script'] ?? 'true';
2257
- }
2258
- const step = {
2259
- name: typedArgs.name,
2260
- type: typedArgs.type,
2261
- properties: {
2262
- property: Object.entries(stepProps).map(([k, v]) => ({ name: k, value: v })),
2263
- },
2264
- };
2265
- await api.buildTypes.addBuildStepToBuildType(typedArgs.buildTypeId, undefined, step, {
2266
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2267
- });
2268
- return json({
2269
- success: true,
2270
- action: 'add_build_step',
2271
- buildTypeId: typedArgs.buildTypeId,
2272
- });
2273
- }
2274
-
2275
- case 'update': {
2276
- if (typedArgs.stepId == null || typedArgs.stepId === '') {
2277
- return json({
2278
- success: false,
2279
- action: 'update_build_step',
2280
- error: 'Step ID is required for update action',
2281
- });
2282
- }
2283
- const props = Object.entries(typedArgs.properties ?? {});
2284
- for (const [k, v] of props) {
2285
- // eslint-disable-next-line no-await-in-loop
2286
- await api.buildTypes.setBuildStepParameter(
2287
- typedArgs.buildTypeId,
2288
- typedArgs.stepId,
2289
- k,
2290
- String(v),
2291
- { headers: { 'Content-Type': 'text/plain', Accept: 'application/json' } }
2292
- );
2293
- }
2294
- return json({
2295
- success: true,
2296
- action: 'update_build_step',
2297
- buildTypeId: typedArgs.buildTypeId,
2298
- stepId: typedArgs.stepId,
2299
- });
2300
- }
2301
-
2302
- case 'delete':
2303
- if (typedArgs.stepId == null || typedArgs.stepId === '') {
2304
- return json({
2305
- success: false,
2306
- action: 'delete_build_step',
2307
- error: 'Step ID is required for delete action',
2308
- });
2309
- }
2310
- await api.buildTypes.deleteBuildStep(typedArgs.buildTypeId, typedArgs.stepId);
2311
- return json({
2312
- success: true,
2313
- action: 'delete_build_step',
2314
- buildTypeId: typedArgs.buildTypeId,
2315
- stepId: typedArgs.stepId,
2316
- });
2317
-
2318
- default:
2319
- return json({ success: false, error: 'Invalid action' });
2320
- }
2321
- },
2322
- mode: 'full',
2323
- },
2324
-
2325
- // === Build Trigger Management ===
2326
- {
2327
- name: 'manage_build_triggers',
2328
- description: 'Add, update, or delete build triggers',
2329
- inputSchema: {
2330
- type: 'object',
2331
- properties: {
2332
- buildTypeId: { type: 'string', description: 'Build type ID' },
2333
- action: { type: 'string', enum: ['add', 'delete'], description: 'Action to perform' },
2334
- triggerId: { type: 'string', description: 'Trigger ID (for delete)' },
2335
- type: { type: 'string', description: 'Trigger type (e.g., vcsTrigger)' },
2336
- properties: { type: 'object', description: 'Trigger properties' },
2337
- },
2338
- required: ['buildTypeId', 'action'],
2339
- },
2340
- handler: async (args: unknown) => {
2341
- const typedArgs = args as ManageBuildTriggersArgs;
2342
-
2343
- const api = TeamCityAPI.getInstance();
2344
-
2345
- switch (typedArgs.action) {
2346
- case 'add': {
2347
- const trigger = {
2348
- type: typedArgs.type,
2349
- properties: {
2350
- property: Object.entries(typedArgs.properties ?? {}).map(([k, v]) => ({
2351
- name: k,
2352
- value: String(v),
2353
- })),
2354
- },
2355
- };
2356
- await api.buildTypes.addTriggerToBuildType(typedArgs.buildTypeId, undefined, trigger, {
2357
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2358
- });
2359
- return json({
2360
- success: true,
2361
- action: 'add_build_trigger',
2362
- buildTypeId: typedArgs.buildTypeId,
2363
- });
2364
- }
2365
-
2366
- case 'delete':
2367
- if (!typedArgs.triggerId) {
2368
- return json({
2369
- success: false,
2370
- action: 'delete_build_trigger',
2371
- error: 'Trigger ID is required for delete action',
2372
- });
2373
- }
2374
- await api.buildTypes.deleteTrigger(typedArgs.buildTypeId, typedArgs.triggerId);
2375
- return json({
2376
- success: true,
2377
- action: 'delete_build_trigger',
2378
- buildTypeId: typedArgs.buildTypeId,
2379
- triggerId: typedArgs.triggerId,
2380
- });
2381
-
2382
- default:
2383
- return json({ success: false, error: 'Invalid action' });
2384
- }
2385
- },
2386
- mode: 'full',
2387
- },
2388
-
2389
- // === Batch pause/unpause specific build configurations ===
2390
- {
2391
- name: 'set_build_configs_paused',
2392
- description: 'Set paused/unpaused for a list of build configurations; optionally cancel queued',
2393
- inputSchema: {
2394
- type: 'object',
2395
- properties: {
2396
- buildTypeIds: {
2397
- type: 'array',
2398
- items: { type: 'string' },
2399
- description: 'List of buildType IDs',
2400
- },
2401
- paused: { type: 'boolean', description: 'True to pause, false to unpause' },
2402
- cancelQueued: { type: 'boolean', description: 'Cancel queued builds for these configs' },
2403
- },
2404
- required: ['buildTypeIds', 'paused'],
2405
- },
2406
- handler: async (args: unknown) => {
2407
- const schema = z.object({
2408
- buildTypeIds: z.array(z.string().min(1)).min(1),
2409
- paused: z.boolean(),
2410
- cancelQueued: z.boolean().optional(),
2411
- });
2412
- return runTool(
2413
- 'set_build_configs_paused',
2414
- schema,
2415
- async (typed) => {
2416
- const api = TeamCityAPI.getInstance();
2417
- let updated = 0;
2418
- for (const id of typed.buildTypeIds) {
2419
- // eslint-disable-next-line no-await-in-loop
2420
- await api.buildTypes.setBuildTypeField(id, 'paused', String(typed.paused));
2421
- updated += 1;
2422
- }
2423
- let canceled = 0;
2424
- if (typed.cancelQueued) {
2425
- const queue = await api.buildQueue.getAllQueuedBuilds();
2426
- const builds = (queue.data?.build ?? []) as Array<{
2427
- id?: number;
2428
- buildTypeId?: string;
2429
- }>;
2430
- const ids = new Set(typed.buildTypeIds);
2431
- const toCancel = builds.filter((b) => b.buildTypeId && ids.has(b.buildTypeId));
2432
- for (const b of toCancel) {
2433
- if (b.id == null) continue;
2434
- // eslint-disable-next-line no-await-in-loop
2435
- await api.buildQueue.deleteQueuedBuild(String(b.id));
2436
- canceled += 1;
2437
- }
2438
- }
2439
- return json({
2440
- success: true,
2441
- action: 'set_build_configs_paused',
2442
- updated,
2443
- canceled,
2444
- paused: typed.paused,
2445
- ids: typed.buildTypeIds,
2446
- });
2447
- },
2448
- args
2449
- );
2450
- },
2451
- mode: 'full',
2452
- },
2453
-
2454
- // === Queue Maintenance ===
2455
- {
2456
- name: 'move_queued_build_to_top',
2457
- description: 'Move a queued build to the top of the queue',
2458
- inputSchema: {
2459
- type: 'object',
2460
- properties: { buildId: { type: 'string', description: 'Queued build ID' } },
2461
- required: ['buildId'],
2462
- },
2463
- handler: async (args: unknown) => {
2464
- const schema = z.object({ buildId: z.string().min(1) });
2465
- return runTool(
2466
- 'move_queued_build_to_top',
2467
- schema,
2468
- async (typed) => {
2469
- const api = TeamCityAPI.getInstance();
2470
- await api.buildQueue.setQueuedBuildsOrder(undefined, {
2471
- build: [{ id: parseInt(typed.buildId) }],
2472
- });
2473
- return json({
2474
- success: true,
2475
- action: 'move_queued_build_to_top',
2476
- buildId: typed.buildId,
2477
- });
2478
- },
2479
- args
2480
- );
2481
- },
2482
- mode: 'full',
2483
- },
2484
- {
2485
- name: 'reorder_queued_builds',
2486
- description: 'Reorder queued builds by providing the desired sequence of IDs',
2487
- inputSchema: {
2488
- type: 'object',
2489
- properties: { buildIds: { type: 'array', items: { type: 'string' } } },
2490
- required: ['buildIds'],
2491
- },
2492
- handler: async (args: unknown) => {
2493
- const schema = z.object({ buildIds: z.array(z.string().min(1)).min(1) });
2494
- return runTool(
2495
- 'reorder_queued_builds',
2496
- schema,
2497
- async (typed) => {
2498
- const api = TeamCityAPI.getInstance();
2499
- await api.buildQueue.setQueuedBuildsOrder(undefined, {
2500
- build: typed.buildIds.map((id) => ({ id: parseInt(id) })),
2501
- });
2502
- return json({
2503
- success: true,
2504
- action: 'reorder_queued_builds',
2505
- count: typed.buildIds.length,
2506
- });
2507
- },
2508
- args
2509
- );
2510
- },
2511
- mode: 'full',
2512
- },
2513
- {
2514
- name: 'cancel_queued_builds_for_build_type',
2515
- description: 'Cancel all queued builds for a specific build configuration',
2516
- inputSchema: {
2517
- type: 'object',
2518
- properties: { buildTypeId: { type: 'string', description: 'Build type ID' } },
2519
- required: ['buildTypeId'],
2520
- },
2521
- handler: async (args: unknown) => {
2522
- const schema = z.object({ buildTypeId: z.string().min(1) });
2523
- return runTool(
2524
- 'cancel_queued_builds_for_build_type',
2525
- schema,
2526
- async (typed) => {
2527
- const api = TeamCityAPI.getInstance();
2528
- const queue = await api.buildQueue.getAllQueuedBuilds();
2529
- const builds = (queue.data?.build ?? []) as Array<{ id?: number; buildTypeId?: string }>;
2530
- const toCancel = builds.filter((b) => b.buildTypeId === typed.buildTypeId);
2531
- let canceled = 0;
2532
- for (const b of toCancel) {
2533
- if (b.id == null) continue;
2534
- // eslint-disable-next-line no-await-in-loop
2535
- await api.buildQueue.deleteQueuedBuild(String(b.id));
2536
- canceled += 1;
2537
- }
2538
- return json({
2539
- success: true,
2540
- action: 'cancel_queued_builds_for_build_type',
2541
- buildTypeId: typed.buildTypeId,
2542
- canceled,
2543
- });
2544
- },
2545
- args
2546
- );
2547
- },
2548
- mode: 'full',
2549
- },
2550
- {
2551
- name: 'cancel_queued_builds_by_locator',
2552
- description: 'Cancel all queued builds matching a queue locator expression',
2553
- inputSchema: {
2554
- type: 'object',
2555
- properties: { locator: { type: 'string', description: 'Queue locator expression' } },
2556
- required: ['locator'],
2557
- },
2558
- handler: async (args: unknown) => {
2559
- const schema = z.object({ locator: z.string().min(1) });
2560
- return runTool(
2561
- 'cancel_queued_builds_by_locator',
2562
- schema,
2563
- async (typed) => {
2564
- const api = TeamCityAPI.getInstance();
2565
- const queue = await api.buildQueue.getAllQueuedBuilds(typed.locator);
2566
- const builds = (queue.data?.build ?? []) as Array<{ id?: number }>;
2567
- let canceled = 0;
2568
- for (const b of builds) {
2569
- if (b.id == null) continue;
2570
- // eslint-disable-next-line no-await-in-loop
2571
- await api.buildQueue.deleteQueuedBuild(String(b.id));
2572
- canceled += 1;
2573
- }
2574
- return json({
2575
- success: true,
2576
- action: 'cancel_queued_builds_by_locator',
2577
- locator: typed.locator,
2578
- canceled,
2579
- });
2580
- },
2581
- args
2582
- );
2583
- },
2584
- mode: 'full',
2585
- },
2586
-
2587
- // === Scoped Pause/Resume (by pool) ===
2588
- {
2589
- name: 'pause_queue_for_pool',
2590
- description:
2591
- 'Disable all agents in a pool to pause queue processing; optionally cancel queued builds for a build type',
2592
- inputSchema: {
2593
- type: 'object',
2594
- properties: {
2595
- poolId: { type: 'string', description: 'Agent pool ID' },
2596
- cancelQueuedForBuildTypeId: {
2597
- type: 'string',
2598
- description: 'Optional buildTypeId: cancel queued builds for this configuration',
2599
- },
2600
- comment: { type: 'string', description: 'Optional comment for agent disablement' },
2601
- until: { type: 'string', description: 'Optional ISO datetime to auto-reenable' },
2602
- },
2603
- required: ['poolId'],
2604
- },
2605
- handler: async (args: unknown) => {
2606
- const schema = z.object({
2607
- poolId: z.string().min(1),
2608
- cancelQueuedForBuildTypeId: z.string().min(1).optional(),
2609
- comment: z.string().optional(),
2610
- until: z.string().min(1).optional(),
2611
- });
2612
- return runTool(
2613
- 'pause_queue_for_pool',
2614
- schema,
2615
- async (typed) => {
2616
- const api = TeamCityAPI.getInstance();
2617
- // Disable all agents in pool
2618
- const agentsResp = await api.agents.getAllAgents(`agentPool:(id:${typed.poolId})`);
2619
- const agents = (agentsResp.data?.agent ?? []) as Array<{ id?: string }>;
2620
- const body: { status: boolean; comment?: { text?: string }; statusSwitchTime?: string } =
2621
- {
2622
- status: false,
2623
- };
2624
- if (typed.comment) body.comment = { text: typed.comment };
2625
- if (typed.until) body.statusSwitchTime = typed.until;
2626
- let disabled = 0;
2627
- for (const a of agents) {
2628
- const id = a.id;
2629
- if (!id) continue;
2630
- // eslint-disable-next-line no-await-in-loop
2631
- await api.agents.setEnabledInfo(id, undefined, body, {
2632
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2633
- });
2634
- disabled += 1;
2635
- }
2636
-
2637
- // Optionally cancel queued builds for provided buildTypeId
2638
- let canceled = 0;
2639
- if (typed.cancelQueuedForBuildTypeId) {
2640
- const queue = await api.buildQueue.getAllQueuedBuilds();
2641
- const builds = (queue.data?.build ?? []) as Array<{
2642
- id?: number;
2643
- buildTypeId?: string;
2644
- }>;
2645
- const toCancel = builds.filter(
2646
- (b) => b.buildTypeId === typed.cancelQueuedForBuildTypeId
2647
- );
2648
- for (const b of toCancel) {
2649
- if (b.id == null) continue;
2650
- // eslint-disable-next-line no-await-in-loop
2651
- await api.buildQueue.deleteQueuedBuild(String(b.id));
2652
- canceled += 1;
2653
- }
2654
- }
2655
-
2656
- return json({
2657
- success: true,
2658
- action: 'pause_queue_for_pool',
2659
- poolId: typed.poolId,
2660
- disabledAgents: disabled,
2661
- canceledQueued: canceled,
2662
- });
2663
- },
2664
- args
2665
- );
2666
- },
2667
- mode: 'full',
2668
- },
2669
- {
2670
- name: 'resume_queue_for_pool',
2671
- description: 'Re-enable all agents in a pool to resume queue processing',
2672
- inputSchema: {
2673
- type: 'object',
2674
- properties: { poolId: { type: 'string', description: 'Agent pool ID' } },
2675
- required: ['poolId'],
2676
- },
2677
- handler: async (args: unknown) => {
2678
- const schema = z.object({ poolId: z.string().min(1) });
2679
- return runTool(
2680
- 'resume_queue_for_pool',
2681
- schema,
2682
- async (typed) => {
2683
- const api = TeamCityAPI.getInstance();
2684
- const agentsResp = await api.agents.getAllAgents(`agentPool:(id:${typed.poolId})`);
2685
- const agents = (agentsResp.data?.agent ?? []) as Array<{ id?: string }>;
2686
- let enabled = 0;
2687
- for (const a of agents) {
2688
- const id = a.id;
2689
- if (!id) continue;
2690
- // eslint-disable-next-line no-await-in-loop
2691
- await api.agents.setEnabledInfo(
2692
- id,
2693
- undefined,
2694
- { status: true },
2695
- { headers: { 'Content-Type': 'application/json', Accept: 'application/json' } }
2696
- );
2697
- enabled += 1;
2698
- }
2699
- return json({
2700
- success: true,
2701
- action: 'resume_queue_for_pool',
2702
- poolId: typed.poolId,
2703
- enabledAgents: enabled,
2704
- });
2705
- },
2706
- args
2707
- );
2708
- },
2709
- mode: 'full',
2710
- },
2711
- // === Agent Enable/Disable ===
2712
- {
2713
- name: 'set_agent_enabled',
2714
- description: 'Enable/disable an agent, with optional comment and schedule',
2715
- inputSchema: {
2716
- type: 'object',
2717
- properties: {
2718
- agentId: { type: 'string', description: 'Agent ID' },
2719
- enabled: { type: 'boolean', description: 'True to enable, false to disable' },
2720
- comment: { type: 'string', description: 'Optional comment' },
2721
- until: {
2722
- type: 'string',
2723
- description: 'Optional ISO datetime to auto-flip state',
2724
- },
2725
- },
2726
- required: ['agentId', 'enabled'],
2727
- },
2728
- handler: async (args: unknown) => {
2729
- const schema = z.object({
2730
- agentId: z.string().min(1),
2731
- enabled: z.boolean(),
2732
- comment: z.string().optional(),
2733
- until: z.string().min(1).optional(),
2734
- });
2735
- return runTool(
2736
- 'set_agent_enabled',
2737
- schema,
2738
- async (typed) => {
2739
- const api = TeamCityAPI.getInstance();
2740
- const body: {
2741
- status: boolean;
2742
- comment?: { text?: string };
2743
- statusSwitchTime?: string;
2744
- } = { status: typed.enabled };
2745
- if (typed.comment) body.comment = { text: typed.comment };
2746
- if (typed.until) body.statusSwitchTime = typed.until;
2747
- const resp = await api.agents.setEnabledInfo(typed.agentId, undefined, body, {
2748
- headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
2749
- });
2750
- return json({
2751
- success: true,
2752
- action: 'set_agent_enabled',
2753
- agentId: typed.agentId,
2754
- enabled: resp.data?.status ?? typed.enabled,
2755
- });
2756
- },
2757
- args
2758
- );
2759
- },
2760
- mode: 'full',
2761
- },
2762
- {
2763
- name: 'bulk_set_agents_enabled',
2764
- description:
2765
- 'Bulk enable/disable agents selected by pool or locator; supports comment/schedule',
2766
- inputSchema: {
2767
- type: 'object',
2768
- properties: {
2769
- enabled: { type: 'boolean', description: 'True to enable, false to disable' },
2770
- poolId: { type: 'string', description: 'Agent pool ID (optional)' },
2771
- locator: {
2772
- type: 'string',
2773
- description: 'Agent locator expression (alternative to poolId)',
2774
- },
2775
- comment: { type: 'string', description: 'Optional comment' },
2776
- until: {
2777
- type: 'string',
2778
- description: 'Optional ISO datetime to auto-flip state',
2779
- },
2780
- includeDisabled: {
2781
- type: 'boolean',
2782
- description:
2783
- 'Include disabled agents in selection (default true when not filtering by enabled)',
2784
- },
2785
- },
2786
- required: ['enabled'],
2787
- },
2788
- handler: async (args: unknown) => {
2789
- const schema = z
2790
- .object({
2791
- enabled: z.boolean(),
2792
- poolId: z.string().min(1).optional(),
2793
- locator: z.string().min(1).optional(),
2794
- comment: z.string().optional(),
2795
- until: z.string().min(1).optional(),
2796
- includeDisabled: z.boolean().optional(),
2797
- })
2798
- .refine((v) => Boolean(v.poolId ?? v.locator), {
2799
- message: 'Either poolId or locator is required',
2800
- path: ['poolId'],
2801
- });
2802
- return runTool(
2803
- 'bulk_set_agents_enabled',
2804
- schema,
2805
- async (typed) => {
2806
- const api = TeamCityAPI.getInstance();
2807
- const filters: string[] = [];
2808
- if (typed.poolId) filters.push(`agentPool:(id:${typed.poolId})`);
2809
- if (typed.locator) filters.push(typed.locator);
2810
- if (typed.includeDisabled === false) filters.push('enabled:true');
2811
- const locator = filters.join(',');
2812
-
2813
- const list = await api.agents.getAllAgents(locator);
2814
- const agents = (list.data?.agent ?? []) as Array<{ id?: string; name?: string }>;
2815
- const body: {
2816
- status: boolean;
2817
- comment?: { text?: string };
2818
- statusSwitchTime?: string;
2819
- } = { status: typed.enabled };
2820
- if (typed.comment) body.comment = { text: typed.comment };
2821
- if (typed.until) body.statusSwitchTime = typed.until;
2822
-
2823
- const results: Array<{ id: string; ok: boolean; error?: string }> = [];
2824
- for (const a of agents) {
2825
- const id = String(a.id ?? '');
2826
- if (!id) continue;
2827
- try {
2828
- // eslint-disable-next-line no-await-in-loop
2829
- await api.agents.setEnabledInfo(id, undefined, body, {
2830
- headers: {
2831
- 'Content-Type': 'application/json',
2832
- Accept: 'application/json',
2833
- },
2834
- });
2835
- results.push({ id, ok: true });
2836
- } catch (e) {
2837
- const msg = e instanceof Error ? e.message : 'Unknown error';
2838
- results.push({ id, ok: false, error: msg });
2839
- }
2840
- }
2841
-
2842
- const succeeded = results.filter((r) => r.ok).length;
2843
- const failed = results.length - succeeded;
2844
- return json({
2845
- success: true,
2846
- action: 'bulk_set_agents_enabled',
2847
- total: results.length,
2848
- succeeded,
2849
- failed,
2850
- results,
2851
- locator,
2852
- poolId: typed.poolId,
2853
- });
2854
- },
2855
- args
2856
- );
2857
- },
2858
- mode: 'full',
2859
- },
2860
- ];
2861
-
2862
- /**
2863
- * Get all available tools based on current mode
2864
- */
2865
- export function getAvailableTools(): ToolDefinition[] {
2866
- const mode = getMCPMode();
2867
- if (mode === 'full') {
2868
- const combined = [...DEV_TOOLS, ...FULL_MODE_TOOLS];
2869
- const map = new Map<string, ToolDefinition>();
2870
- for (const t of combined) map.set(t.name, t);
2871
- return Array.from(map.values());
2872
- }
2873
- // Dev mode: include only tools not explicitly marked as full
2874
- return DEV_TOOLS.filter((t) => t.mode !== 'full');
2875
- }
2876
-
2877
- /**
2878
- * Get tool by name (respects current mode)
2879
- */
2880
- export function getTool(name: string): ToolDefinition | undefined {
2881
- const tools = getAvailableTools();
2882
- return tools.find((tool) => tool.name === name);
2883
- }
2884
-
2885
- /**
2886
- * Get tool by name or throw a descriptive error if unavailable.
2887
- * Useful in tests and call sites where the tool is required.
2888
- */
2889
- export function getRequiredTool(name: string): ToolDefinition {
2890
- const tool = getTool(name);
2891
- if (!tool) {
2892
- const mode = getMCPMode();
2893
- throw new Error(`Tool not available in ${mode} mode or not registered: ${name}`);
2894
- }
2895
- return tool;
2896
- }
2897
-
2898
- /**
2899
- * Get all tool names (respects current mode)
2900
- */
2901
- export function getToolNames(): string[] {
2902
- const tools = getAvailableTools();
2903
- return tools.map((tool) => tool.name);
2904
- }