@daghis/teamcity-mcp 0.9.1 → 0.9.2

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 (1132) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/index.js +1707 -16779
  3. package/dist/index.js.map +4 -4
  4. package/package.json +1 -1
  5. package/.commitlintrc.mjs +0 -25
  6. package/.eslintignore +0 -16
  7. package/.eslintrc.js +0 -166
  8. package/.github/dependabot.yml +0 -38
  9. package/.github/settings.yml +0 -7
  10. package/.github/workflows/ci.yml +0 -115
  11. package/.github/workflows/codeql.yml +0 -35
  12. package/.github/workflows/commitlint.yml +0 -20
  13. package/.github/workflows/publish.yml +0 -67
  14. package/.github/workflows/release-please.yml +0 -21
  15. package/.nvmrc +0 -1
  16. package/.prettierignore +0 -22
  17. package/.prettierrc +0 -28
  18. package/AGENTS.md +0 -129
  19. package/ARCHITECTURE.md +0 -66
  20. package/CONTRIBUTING.md +0 -68
  21. package/dist/src/api-client.d.ts +0 -51
  22. package/dist/src/api-client.d.ts.map +0 -1
  23. package/dist/src/config/index.d.ts +0 -41
  24. package/dist/src/config/index.d.ts.map +0 -1
  25. package/dist/src/errors/index.d.ts +0 -2
  26. package/dist/src/errors/index.d.ts.map +0 -1
  27. package/dist/src/formatters/build-step-formatter.d.ts +0 -5
  28. package/dist/src/formatters/build-step-formatter.d.ts.map +0 -1
  29. package/dist/src/formatters/trigger-formatter.d.ts +0 -4
  30. package/dist/src/formatters/trigger-formatter.d.ts.map +0 -1
  31. package/dist/src/index.d.ts +0 -2
  32. package/dist/src/index.d.ts.map +0 -1
  33. package/dist/src/middleware/error.d.ts +0 -56
  34. package/dist/src/middleware/error.d.ts.map +0 -1
  35. package/dist/src/middleware/global-error-handler.d.ts +0 -22
  36. package/dist/src/middleware/global-error-handler.d.ts.map +0 -1
  37. package/dist/src/middleware/index.d.ts +0 -2
  38. package/dist/src/middleware/index.d.ts.map +0 -1
  39. package/dist/src/server.d.ts +0 -4
  40. package/dist/src/server.d.ts.map +0 -1
  41. package/dist/src/swagger/index.d.ts +0 -43
  42. package/dist/src/swagger/index.d.ts.map +0 -1
  43. package/dist/src/swagger/swagger-cache.d.ts +0 -23
  44. package/dist/src/swagger/swagger-cache.d.ts.map +0 -1
  45. package/dist/src/swagger/swagger-fetcher.d.ts +0 -24
  46. package/dist/src/swagger/swagger-fetcher.d.ts.map +0 -1
  47. package/dist/src/swagger/swagger-validator.d.ts +0 -17
  48. package/dist/src/swagger/swagger-validator.d.ts.map +0 -1
  49. package/dist/src/teamcity/api-types.d.ts +0 -224
  50. package/dist/src/teamcity/api-types.d.ts.map +0 -1
  51. package/dist/src/teamcity/artifact-manager.d.ts +0 -52
  52. package/dist/src/teamcity/artifact-manager.d.ts.map +0 -1
  53. package/dist/src/teamcity/auth.d.ts +0 -22
  54. package/dist/src/teamcity/auth.d.ts.map +0 -1
  55. package/dist/src/teamcity/branch-discovery-manager.d.ts +0 -39
  56. package/dist/src/teamcity/branch-discovery-manager.d.ts.map +0 -1
  57. package/dist/src/teamcity/branch-filtering-service.d.ts +0 -62
  58. package/dist/src/teamcity/branch-filtering-service.d.ts.map +0 -1
  59. package/dist/src/teamcity/branch-specification-parser.d.ts +0 -33
  60. package/dist/src/teamcity/branch-specification-parser.d.ts.map +0 -1
  61. package/dist/src/teamcity/build-config-manager.d.ts +0 -75
  62. package/dist/src/teamcity/build-config-manager.d.ts.map +0 -1
  63. package/dist/src/teamcity/build-config-navigator.d.ts +0 -89
  64. package/dist/src/teamcity/build-config-navigator.d.ts.map +0 -1
  65. package/dist/src/teamcity/build-configuration-clone-manager.d.ts +0 -49
  66. package/dist/src/teamcity/build-configuration-clone-manager.d.ts.map +0 -1
  67. package/dist/src/teamcity/build-configuration-manager.d.ts +0 -82
  68. package/dist/src/teamcity/build-configuration-manager.d.ts.map +0 -1
  69. package/dist/src/teamcity/build-configuration-resolver.d.ts +0 -95
  70. package/dist/src/teamcity/build-configuration-resolver.d.ts.map +0 -1
  71. package/dist/src/teamcity/build-configuration-update-manager.d.ts +0 -76
  72. package/dist/src/teamcity/build-configuration-update-manager.d.ts.map +0 -1
  73. package/dist/src/teamcity/build-list-manager.d.ts +0 -62
  74. package/dist/src/teamcity/build-list-manager.d.ts.map +0 -1
  75. package/dist/src/teamcity/build-parameters-manager.d.ts +0 -143
  76. package/dist/src/teamcity/build-parameters-manager.d.ts.map +0 -1
  77. package/dist/src/teamcity/build-progress-tracker.d.ts +0 -49
  78. package/dist/src/teamcity/build-progress-tracker.d.ts.map +0 -1
  79. package/dist/src/teamcity/build-query-builder.d.ts +0 -27
  80. package/dist/src/teamcity/build-query-builder.d.ts.map +0 -1
  81. package/dist/src/teamcity/build-queue-manager.d.ts +0 -102
  82. package/dist/src/teamcity/build-queue-manager.d.ts.map +0 -1
  83. package/dist/src/teamcity/build-results-manager.d.ts +0 -87
  84. package/dist/src/teamcity/build-results-manager.d.ts.map +0 -1
  85. package/dist/src/teamcity/build-status-manager.d.ts +0 -65
  86. package/dist/src/teamcity/build-status-manager.d.ts.map +0 -1
  87. package/dist/src/teamcity/build-step-manager.d.ts +0 -65
  88. package/dist/src/teamcity/build-step-manager.d.ts.map +0 -1
  89. package/dist/src/teamcity/build-trigger-manager.d.ts +0 -108
  90. package/dist/src/teamcity/build-trigger-manager.d.ts.map +0 -1
  91. package/dist/src/teamcity/circuit-breaker.d.ts +0 -47
  92. package/dist/src/teamcity/circuit-breaker.d.ts.map +0 -1
  93. package/dist/src/teamcity/client-adapter.d.ts +0 -12
  94. package/dist/src/teamcity/client-adapter.d.ts.map +0 -1
  95. package/dist/src/teamcity/client.d.ts +0 -49
  96. package/dist/src/teamcity/client.d.ts.map +0 -1
  97. package/dist/src/teamcity/config.d.ts +0 -41
  98. package/dist/src/teamcity/config.d.ts.map +0 -1
  99. package/dist/src/teamcity/configuration-branch-matcher.d.ts +0 -37
  100. package/dist/src/teamcity/configuration-branch-matcher.d.ts.map +0 -1
  101. package/dist/src/teamcity/errors.d.ts +0 -79
  102. package/dist/src/teamcity/errors.d.ts.map +0 -1
  103. package/dist/src/teamcity/index.d.ts +0 -48
  104. package/dist/src/teamcity/index.d.ts.map +0 -1
  105. package/dist/src/teamcity/pagination.d.ts +0 -32
  106. package/dist/src/teamcity/pagination.d.ts.map +0 -1
  107. package/dist/src/teamcity/project-list-manager.d.ts +0 -19
  108. package/dist/src/teamcity/project-list-manager.d.ts.map +0 -1
  109. package/dist/src/teamcity/project-manager.d.ts +0 -73
  110. package/dist/src/teamcity/project-manager.d.ts.map +0 -1
  111. package/dist/src/teamcity/project-navigator.d.ts +0 -100
  112. package/dist/src/teamcity/project-navigator.d.ts.map +0 -1
  113. package/dist/src/teamcity/test-problem-reporter.d.ts +0 -60
  114. package/dist/src/teamcity/test-problem-reporter.d.ts.map +0 -1
  115. package/dist/src/teamcity/types/api-responses.d.ts +0 -235
  116. package/dist/src/teamcity/types/api-responses.d.ts.map +0 -1
  117. package/dist/src/teamcity-client/api/agent-api.d.ts +0 -97
  118. package/dist/src/teamcity-client/api/agent-api.d.ts.map +0 -1
  119. package/dist/src/teamcity-client/api/agent-pool-api.d.ts +0 -92
  120. package/dist/src/teamcity-client/api/agent-pool-api.d.ts.map +0 -1
  121. package/dist/src/teamcity-client/api/agent-type-api.d.ts +0 -20
  122. package/dist/src/teamcity-client/api/agent-type-api.d.ts.map +0 -1
  123. package/dist/src/teamcity-client/api/audit-api.d.ts +0 -26
  124. package/dist/src/teamcity-client/api/audit-api.d.ts.map +0 -1
  125. package/dist/src/teamcity-client/api/avatar-api.d.ts +0 -34
  126. package/dist/src/teamcity-client/api/avatar-api.d.ts.map +0 -1
  127. package/dist/src/teamcity-client/api/build-api.d.ts +0 -315
  128. package/dist/src/teamcity-client/api/build-api.d.ts.map +0 -1
  129. package/dist/src/teamcity-client/api/build-queue-api.d.ts +0 -90
  130. package/dist/src/teamcity-client/api/build-queue-api.d.ts.map +0 -1
  131. package/dist/src/teamcity-client/api/build-type-api.d.ts +0 -585
  132. package/dist/src/teamcity-client/api/build-type-api.d.ts.map +0 -1
  133. package/dist/src/teamcity-client/api/change-api.d.ts +0 -71
  134. package/dist/src/teamcity-client/api/change-api.d.ts.map +0 -1
  135. package/dist/src/teamcity-client/api/cloud-instance-api.d.ts +0 -70
  136. package/dist/src/teamcity-client/api/cloud-instance-api.d.ts.map +0 -1
  137. package/dist/src/teamcity-client/api/deployment-dashboard-api.d.ts +0 -64
  138. package/dist/src/teamcity-client/api/deployment-dashboard-api.d.ts.map +0 -1
  139. package/dist/src/teamcity-client/api/global-server-settings-api.d.ts +0 -25
  140. package/dist/src/teamcity-client/api/global-server-settings-api.d.ts.map +0 -1
  141. package/dist/src/teamcity-client/api/group-api.d.ts +0 -99
  142. package/dist/src/teamcity-client/api/group-api.d.ts.map +0 -1
  143. package/dist/src/teamcity-client/api/health-api.d.ts +0 -38
  144. package/dist/src/teamcity-client/api/health-api.d.ts.map +0 -1
  145. package/dist/src/teamcity-client/api/investigation-api.d.ts +0 -46
  146. package/dist/src/teamcity-client/api/investigation-api.d.ts.map +0 -1
  147. package/dist/src/teamcity-client/api/mute-api.d.ts +0 -46
  148. package/dist/src/teamcity-client/api/mute-api.d.ts.map +0 -1
  149. package/dist/src/teamcity-client/api/node-api.d.ts +0 -49
  150. package/dist/src/teamcity-client/api/node-api.d.ts.map +0 -1
  151. package/dist/src/teamcity-client/api/problem-api.d.ts +0 -26
  152. package/dist/src/teamcity-client/api/problem-api.d.ts.map +0 -1
  153. package/dist/src/teamcity-client/api/problem-occurrence-api.d.ts +0 -26
  154. package/dist/src/teamcity-client/api/problem-occurrence-api.d.ts.map +0 -1
  155. package/dist/src/teamcity-client/api/project-api.d.ts +0 -271
  156. package/dist/src/teamcity-client/api/project-api.d.ts.map +0 -1
  157. package/dist/src/teamcity-client/api/role-api.d.ts +0 -56
  158. package/dist/src/teamcity-client/api/role-api.d.ts.map +0 -1
  159. package/dist/src/teamcity-client/api/root-api.d.ts +0 -35
  160. package/dist/src/teamcity-client/api/root-api.d.ts.map +0 -1
  161. package/dist/src/teamcity-client/api/server-api.d.ts +0 -112
  162. package/dist/src/teamcity-client/api/server-api.d.ts.map +0 -1
  163. package/dist/src/teamcity-client/api/server-authentication-settings-api.d.ts +0 -25
  164. package/dist/src/teamcity-client/api/server-authentication-settings-api.d.ts.map +0 -1
  165. package/dist/src/teamcity-client/api/test-api.d.ts +0 -26
  166. package/dist/src/teamcity-client/api/test-api.d.ts.map +0 -1
  167. package/dist/src/teamcity-client/api/test-occurrence-api.d.ts +0 -26
  168. package/dist/src/teamcity-client/api/test-occurrence-api.d.ts.map +0 -1
  169. package/dist/src/teamcity-client/api/user-api.d.ts +0 -164
  170. package/dist/src/teamcity-client/api/user-api.d.ts.map +0 -1
  171. package/dist/src/teamcity-client/api/vcs-root-api.d.ts +0 -88
  172. package/dist/src/teamcity-client/api/vcs-root-api.d.ts.map +0 -1
  173. package/dist/src/teamcity-client/api/vcs-root-instance-api.d.ts +0 -104
  174. package/dist/src/teamcity-client/api/vcs-root-instance-api.d.ts.map +0 -1
  175. package/dist/src/teamcity-client/api/versioned-settings-api.d.ts +0 -94
  176. package/dist/src/teamcity-client/api/versioned-settings-api.d.ts.map +0 -1
  177. package/dist/src/teamcity-client/api.d.ts +0 -31
  178. package/dist/src/teamcity-client/api.d.ts.map +0 -1
  179. package/dist/src/teamcity-client/base.d.ts +0 -32
  180. package/dist/src/teamcity-client/base.d.ts.map +0 -1
  181. package/dist/src/teamcity-client/common.d.ts +0 -14
  182. package/dist/src/teamcity-client/common.d.ts.map +0 -1
  183. package/dist/src/teamcity-client/configuration.d.ts +0 -23
  184. package/dist/src/teamcity-client/configuration.d.ts.map +0 -1
  185. package/dist/src/teamcity-client/index.d.ts +0 -4
  186. package/dist/src/teamcity-client/index.d.ts.map +0 -1
  187. package/dist/src/teamcity-client/models/agent-locator.d.ts +0 -34
  188. package/dist/src/teamcity-client/models/agent-locator.d.ts.map +0 -1
  189. package/dist/src/teamcity-client/models/agent-pool-locator.d.ts +0 -10
  190. package/dist/src/teamcity-client/models/agent-pool-locator.d.ts.map +0 -1
  191. package/dist/src/teamcity-client/models/agent-pool.d.ts +0 -16
  192. package/dist/src/teamcity-client/models/agent-pool.d.ts.map +0 -1
  193. package/dist/src/teamcity-client/models/agent-pools.d.ts +0 -9
  194. package/dist/src/teamcity-client/models/agent-pools.d.ts.map +0 -1
  195. package/dist/src/teamcity-client/models/agent-requirement.d.ts +0 -11
  196. package/dist/src/teamcity-client/models/agent-requirement.d.ts.map +0 -1
  197. package/dist/src/teamcity-client/models/agent-requirements.d.ts +0 -6
  198. package/dist/src/teamcity-client/models/agent-requirements.d.ts.map +0 -1
  199. package/dist/src/teamcity-client/models/agent-type-locator.d.ts +0 -8
  200. package/dist/src/teamcity-client/models/agent-type-locator.d.ts.map +0 -1
  201. package/dist/src/teamcity-client/models/agent-type.d.ts +0 -14
  202. package/dist/src/teamcity-client/models/agent-type.d.ts.map +0 -1
  203. package/dist/src/teamcity-client/models/agent-types.d.ts +0 -9
  204. package/dist/src/teamcity-client/models/agent-types.d.ts.map +0 -1
  205. package/dist/src/teamcity-client/models/agent.d.ts +0 -59
  206. package/dist/src/teamcity-client/models/agent.d.ts.map +0 -1
  207. package/dist/src/teamcity-client/models/agents.d.ts +0 -9
  208. package/dist/src/teamcity-client/models/agents.d.ts.map +0 -1
  209. package/dist/src/teamcity-client/models/approvable-build.d.ts +0 -6
  210. package/dist/src/teamcity-client/models/approvable-build.d.ts.map +0 -1
  211. package/dist/src/teamcity-client/models/approval-info.d.ts +0 -24
  212. package/dist/src/teamcity-client/models/approval-info.d.ts.map +0 -1
  213. package/dist/src/teamcity-client/models/artifact-dependencies.d.ts +0 -7
  214. package/dist/src/teamcity-client/models/artifact-dependencies.d.ts.map +0 -1
  215. package/dist/src/teamcity-client/models/artifact-dependency.d.ts +0 -13
  216. package/dist/src/teamcity-client/models/artifact-dependency.d.ts.map +0 -1
  217. package/dist/src/teamcity-client/models/artifact-download-info.d.ts +0 -5
  218. package/dist/src/teamcity-client/models/artifact-download-info.d.ts.map +0 -1
  219. package/dist/src/teamcity-client/models/audit-action.d.ts +0 -6
  220. package/dist/src/teamcity-client/models/audit-action.d.ts.map +0 -1
  221. package/dist/src/teamcity-client/models/audit-event.d.ts +0 -12
  222. package/dist/src/teamcity-client/models/audit-event.d.ts.map +0 -1
  223. package/dist/src/teamcity-client/models/audit-events.d.ts +0 -9
  224. package/dist/src/teamcity-client/models/audit-events.d.ts.map +0 -1
  225. package/dist/src/teamcity-client/models/audit-locator.d.ts +0 -245
  226. package/dist/src/teamcity-client/models/audit-locator.d.ts.map +0 -1
  227. package/dist/src/teamcity-client/models/auth-module.d.ts +0 -6
  228. package/dist/src/teamcity-client/models/auth-module.d.ts.map +0 -1
  229. package/dist/src/teamcity-client/models/auth-modules.d.ts +0 -5
  230. package/dist/src/teamcity-client/models/auth-modules.d.ts.map +0 -1
  231. package/dist/src/teamcity-client/models/authorization-tokens-requirements.d.ts +0 -5
  232. package/dist/src/teamcity-client/models/authorization-tokens-requirements.d.ts.map +0 -1
  233. package/dist/src/teamcity-client/models/authorized-info.d.ts +0 -6
  234. package/dist/src/teamcity-client/models/authorized-info.d.ts.map +0 -1
  235. package/dist/src/teamcity-client/models/branch-locator.d.ts +0 -40
  236. package/dist/src/teamcity-client/models/branch-locator.d.ts.map +0 -1
  237. package/dist/src/teamcity-client/models/branch-version.d.ts +0 -13
  238. package/dist/src/teamcity-client/models/branch-version.d.ts.map +0 -1
  239. package/dist/src/teamcity-client/models/branch.d.ts +0 -12
  240. package/dist/src/teamcity-client/models/branch.d.ts.map +0 -1
  241. package/dist/src/teamcity-client/models/branches.d.ts +0 -7
  242. package/dist/src/teamcity-client/models/branches.d.ts.map +0 -1
  243. package/dist/src/teamcity-client/models/build-cancel-request.d.ts +0 -5
  244. package/dist/src/teamcity-client/models/build-cancel-request.d.ts.map +0 -1
  245. package/dist/src/teamcity-client/models/build-change.d.ts +0 -6
  246. package/dist/src/teamcity-client/models/build-change.d.ts.map +0 -1
  247. package/dist/src/teamcity-client/models/build-changes.d.ts +0 -6
  248. package/dist/src/teamcity-client/models/build-changes.d.ts.map +0 -1
  249. package/dist/src/teamcity-client/models/build-executor.d.ts +0 -4
  250. package/dist/src/teamcity-client/models/build-executor.d.ts.map +0 -1
  251. package/dist/src/teamcity-client/models/build-locator.d.ts +0 -69
  252. package/dist/src/teamcity-client/models/build-locator.d.ts.map +0 -1
  253. package/dist/src/teamcity-client/models/build-queue-locator.d.ts +0 -14
  254. package/dist/src/teamcity-client/models/build-queue-locator.d.ts.map +0 -1
  255. package/dist/src/teamcity-client/models/build-status-update.d.ts +0 -5
  256. package/dist/src/teamcity-client/models/build-status-update.d.ts.map +0 -1
  257. package/dist/src/teamcity-client/models/build-trigger-customization.d.ts +0 -7
  258. package/dist/src/teamcity-client/models/build-trigger-customization.d.ts.map +0 -1
  259. package/dist/src/teamcity-client/models/build-triggering-options.d.ts +0 -12
  260. package/dist/src/teamcity-client/models/build-triggering-options.d.ts.map +0 -1
  261. package/dist/src/teamcity-client/models/build-type-locator.d.ts +0 -18
  262. package/dist/src/teamcity-client/models/build-type-locator.d.ts.map +0 -1
  263. package/dist/src/teamcity-client/models/build-type.d.ts +0 -64
  264. package/dist/src/teamcity-client/models/build-type.d.ts.map +0 -1
  265. package/dist/src/teamcity-client/models/build-types.d.ts +0 -9
  266. package/dist/src/teamcity-client/models/build-types.d.ts.map +0 -1
  267. package/dist/src/teamcity-client/models/build.d.ts +0 -127
  268. package/dist/src/teamcity-client/models/build.d.ts.map +0 -1
  269. package/dist/src/teamcity-client/models/builds-with-reason.d.ts +0 -6
  270. package/dist/src/teamcity-client/models/builds-with-reason.d.ts.map +0 -1
  271. package/dist/src/teamcity-client/models/builds.d.ts +0 -9
  272. package/dist/src/teamcity-client/models/builds.d.ts.map +0 -1
  273. package/dist/src/teamcity-client/models/change-locator.d.ts +0 -21
  274. package/dist/src/teamcity-client/models/change-locator.d.ts.map +0 -1
  275. package/dist/src/teamcity-client/models/change-status.d.ts +0 -19
  276. package/dist/src/teamcity-client/models/change-status.d.ts.map +0 -1
  277. package/dist/src/teamcity-client/models/change.d.ts +0 -35
  278. package/dist/src/teamcity-client/models/change.d.ts.map +0 -1
  279. package/dist/src/teamcity-client/models/changes.d.ts +0 -9
  280. package/dist/src/teamcity-client/models/changes.d.ts.map +0 -1
  281. package/dist/src/teamcity-client/models/cleanup.d.ts +0 -9
  282. package/dist/src/teamcity-client/models/cleanup.d.ts.map +0 -1
  283. package/dist/src/teamcity-client/models/cloud-error.d.ts +0 -5
  284. package/dist/src/teamcity-client/models/cloud-error.d.ts.map +0 -1
  285. package/dist/src/teamcity-client/models/cloud-image-locator.d.ts +0 -17
  286. package/dist/src/teamcity-client/models/cloud-image-locator.d.ts.map +0 -1
  287. package/dist/src/teamcity-client/models/cloud-image.d.ts +0 -18
  288. package/dist/src/teamcity-client/models/cloud-image.d.ts.map +0 -1
  289. package/dist/src/teamcity-client/models/cloud-images.d.ts +0 -9
  290. package/dist/src/teamcity-client/models/cloud-images.d.ts.map +0 -1
  291. package/dist/src/teamcity-client/models/cloud-instance-locator.d.ts +0 -13
  292. package/dist/src/teamcity-client/models/cloud-instance-locator.d.ts.map +0 -1
  293. package/dist/src/teamcity-client/models/cloud-instance.d.ts +0 -16
  294. package/dist/src/teamcity-client/models/cloud-instance.d.ts.map +0 -1
  295. package/dist/src/teamcity-client/models/cloud-instances.d.ts +0 -9
  296. package/dist/src/teamcity-client/models/cloud-instances.d.ts.map +0 -1
  297. package/dist/src/teamcity-client/models/cloud-profile-locator.d.ts +0 -13
  298. package/dist/src/teamcity-client/models/cloud-profile-locator.d.ts.map +0 -1
  299. package/dist/src/teamcity-client/models/cloud-profile.d.ts +0 -13
  300. package/dist/src/teamcity-client/models/cloud-profile.d.ts.map +0 -1
  301. package/dist/src/teamcity-client/models/cloud-profiles.d.ts +0 -9
  302. package/dist/src/teamcity-client/models/cloud-profiles.d.ts.map +0 -1
  303. package/dist/src/teamcity-client/models/comment.d.ts +0 -7
  304. package/dist/src/teamcity-client/models/comment.d.ts.map +0 -1
  305. package/dist/src/teamcity-client/models/commiter.d.ts +0 -6
  306. package/dist/src/teamcity-client/models/commiter.d.ts.map +0 -1
  307. package/dist/src/teamcity-client/models/compatibilities.d.ts +0 -6
  308. package/dist/src/teamcity-client/models/compatibilities.d.ts.map +0 -1
  309. package/dist/src/teamcity-client/models/compatibility-policy.d.ts +0 -6
  310. package/dist/src/teamcity-client/models/compatibility-policy.d.ts.map +0 -1
  311. package/dist/src/teamcity-client/models/compatibility.d.ts +0 -10
  312. package/dist/src/teamcity-client/models/compatibility.d.ts.map +0 -1
  313. package/dist/src/teamcity-client/models/composite-approval-rule.d.ts +0 -10
  314. package/dist/src/teamcity-client/models/composite-approval-rule.d.ts.map +0 -1
  315. package/dist/src/teamcity-client/models/composite-approvals.d.ts +0 -6
  316. package/dist/src/teamcity-client/models/composite-approvals.d.ts.map +0 -1
  317. package/dist/src/teamcity-client/models/cron.d.ts +0 -8
  318. package/dist/src/teamcity-client/models/cron.d.ts.map +0 -1
  319. package/dist/src/teamcity-client/models/customizations.d.ts +0 -15
  320. package/dist/src/teamcity-client/models/customizations.d.ts.map +0 -1
  321. package/dist/src/teamcity-client/models/daily.d.ts +0 -5
  322. package/dist/src/teamcity-client/models/daily.d.ts.map +0 -1
  323. package/dist/src/teamcity-client/models/datas.d.ts +0 -6
  324. package/dist/src/teamcity-client/models/datas.d.ts.map +0 -1
  325. package/dist/src/teamcity-client/models/deployment-dashboard-locator.d.ts +0 -9
  326. package/dist/src/teamcity-client/models/deployment-dashboard-locator.d.ts.map +0 -1
  327. package/dist/src/teamcity-client/models/deployment-dashboard.d.ts +0 -9
  328. package/dist/src/teamcity-client/models/deployment-dashboard.d.ts.map +0 -1
  329. package/dist/src/teamcity-client/models/deployment-dashboards.d.ts +0 -9
  330. package/dist/src/teamcity-client/models/deployment-dashboards.d.ts.map +0 -1
  331. package/dist/src/teamcity-client/models/deployment-history.d.ts +0 -6
  332. package/dist/src/teamcity-client/models/deployment-history.d.ts.map +0 -1
  333. package/dist/src/teamcity-client/models/deployment-instance-locator.d.ts +0 -16
  334. package/dist/src/teamcity-client/models/deployment-instance-locator.d.ts.map +0 -1
  335. package/dist/src/teamcity-client/models/deployment-instance.d.ts +0 -20
  336. package/dist/src/teamcity-client/models/deployment-instance.d.ts.map +0 -1
  337. package/dist/src/teamcity-client/models/deployment-instances.d.ts +0 -9
  338. package/dist/src/teamcity-client/models/deployment-instances.d.ts.map +0 -1
  339. package/dist/src/teamcity-client/models/deployment-state-entries.d.ts +0 -8
  340. package/dist/src/teamcity-client/models/deployment-state-entries.d.ts.map +0 -1
  341. package/dist/src/teamcity-client/models/deployment-state-entry.d.ts +0 -16
  342. package/dist/src/teamcity-client/models/deployment-state-entry.d.ts.map +0 -1
  343. package/dist/src/teamcity-client/models/disabled-responsibilities.d.ts +0 -6
  344. package/dist/src/teamcity-client/models/disabled-responsibilities.d.ts.map +0 -1
  345. package/dist/src/teamcity-client/models/download-info.d.ts +0 -8
  346. package/dist/src/teamcity-client/models/download-info.d.ts.map +0 -1
  347. package/dist/src/teamcity-client/models/downloaded-artifacts.d.ts +0 -7
  348. package/dist/src/teamcity-client/models/downloaded-artifacts.d.ts.map +0 -1
  349. package/dist/src/teamcity-client/models/effective-responsibilities.d.ts +0 -6
  350. package/dist/src/teamcity-client/models/effective-responsibilities.d.ts.map +0 -1
  351. package/dist/src/teamcity-client/models/enabled-info.d.ts +0 -7
  352. package/dist/src/teamcity-client/models/enabled-info.d.ts.map +0 -1
  353. package/dist/src/teamcity-client/models/enabled-responsibilities.d.ts +0 -6
  354. package/dist/src/teamcity-client/models/enabled-responsibilities.d.ts.map +0 -1
  355. package/dist/src/teamcity-client/models/entries.d.ts +0 -6
  356. package/dist/src/teamcity-client/models/entries.d.ts.map +0 -1
  357. package/dist/src/teamcity-client/models/entry.d.ts +0 -5
  358. package/dist/src/teamcity-client/models/entry.d.ts.map +0 -1
  359. package/dist/src/teamcity-client/models/environment.d.ts +0 -5
  360. package/dist/src/teamcity-client/models/environment.d.ts.map +0 -1
  361. package/dist/src/teamcity-client/models/feature.d.ts +0 -11
  362. package/dist/src/teamcity-client/models/feature.d.ts.map +0 -1
  363. package/dist/src/teamcity-client/models/features.d.ts +0 -6
  364. package/dist/src/teamcity-client/models/features.d.ts.map +0 -1
  365. package/dist/src/teamcity-client/models/file-change.d.ts +0 -10
  366. package/dist/src/teamcity-client/models/file-change.d.ts.map +0 -1
  367. package/dist/src/teamcity-client/models/file-changes.d.ts +0 -6
  368. package/dist/src/teamcity-client/models/file-changes.d.ts.map +0 -1
  369. package/dist/src/teamcity-client/models/files.d.ts +0 -6
  370. package/dist/src/teamcity-client/models/files.d.ts.map +0 -1
  371. package/dist/src/teamcity-client/models/group-approval-rule.d.ts +0 -8
  372. package/dist/src/teamcity-client/models/group-approval-rule.d.ts.map +0 -1
  373. package/dist/src/teamcity-client/models/group-approvals.d.ts +0 -6
  374. package/dist/src/teamcity-client/models/group-approvals.d.ts.map +0 -1
  375. package/dist/src/teamcity-client/models/group.d.ts +0 -16
  376. package/dist/src/teamcity-client/models/group.d.ts.map +0 -1
  377. package/dist/src/teamcity-client/models/groups.d.ts +0 -6
  378. package/dist/src/teamcity-client/models/groups.d.ts.map +0 -1
  379. package/dist/src/teamcity-client/models/health-categories.d.ts +0 -9
  380. package/dist/src/teamcity-client/models/health-categories.d.ts.map +0 -1
  381. package/dist/src/teamcity-client/models/health-category.d.ts +0 -7
  382. package/dist/src/teamcity-client/models/health-category.d.ts.map +0 -1
  383. package/dist/src/teamcity-client/models/health-item.d.ts +0 -13
  384. package/dist/src/teamcity-client/models/health-item.d.ts.map +0 -1
  385. package/dist/src/teamcity-client/models/health-status-items.d.ts +0 -9
  386. package/dist/src/teamcity-client/models/health-status-items.d.ts.map +0 -1
  387. package/dist/src/teamcity-client/models/href.d.ts +0 -4
  388. package/dist/src/teamcity-client/models/href.d.ts.map +0 -1
  389. package/dist/src/teamcity-client/models/index.d.ts +0 -230
  390. package/dist/src/teamcity-client/models/index.d.ts.map +0 -1
  391. package/dist/src/teamcity-client/models/investigation-locator.d.ts +0 -35
  392. package/dist/src/teamcity-client/models/investigation-locator.d.ts.map +0 -1
  393. package/dist/src/teamcity-client/models/investigation.d.ts +0 -24
  394. package/dist/src/teamcity-client/models/investigation.d.ts.map +0 -1
  395. package/dist/src/teamcity-client/models/investigations.d.ts +0 -9
  396. package/dist/src/teamcity-client/models/investigations.d.ts.map +0 -1
  397. package/dist/src/teamcity-client/models/issue-usage.d.ts +0 -7
  398. package/dist/src/teamcity-client/models/issue-usage.d.ts.map +0 -1
  399. package/dist/src/teamcity-client/models/issue.d.ts +0 -5
  400. package/dist/src/teamcity-client/models/issue.d.ts.map +0 -1
  401. package/dist/src/teamcity-client/models/issues-usages.d.ts +0 -7
  402. package/dist/src/teamcity-client/models/issues-usages.d.ts.map +0 -1
  403. package/dist/src/teamcity-client/models/issues.d.ts +0 -5
  404. package/dist/src/teamcity-client/models/issues.d.ts.map +0 -1
  405. package/dist/src/teamcity-client/models/items.d.ts +0 -4
  406. package/dist/src/teamcity-client/models/items.d.ts.map +0 -1
  407. package/dist/src/teamcity-client/models/labeled-value.d.ts +0 -5
  408. package/dist/src/teamcity-client/models/labeled-value.d.ts.map +0 -1
  409. package/dist/src/teamcity-client/models/license-key.d.ts +0 -29
  410. package/dist/src/teamcity-client/models/license-key.d.ts.map +0 -1
  411. package/dist/src/teamcity-client/models/license-keys.d.ts +0 -7
  412. package/dist/src/teamcity-client/models/license-keys.d.ts.map +0 -1
  413. package/dist/src/teamcity-client/models/licensing-data.d.ts +0 -26
  414. package/dist/src/teamcity-client/models/licensing-data.d.ts.map +0 -1
  415. package/dist/src/teamcity-client/models/link.d.ts +0 -6
  416. package/dist/src/teamcity-client/models/link.d.ts.map +0 -1
  417. package/dist/src/teamcity-client/models/links.d.ts +0 -6
  418. package/dist/src/teamcity-client/models/links.d.ts.map +0 -1
  419. package/dist/src/teamcity-client/models/matrix-build-feature-descriptor.d.ts +0 -8
  420. package/dist/src/teamcity-client/models/matrix-build-feature-descriptor.d.ts.map +0 -1
  421. package/dist/src/teamcity-client/models/matrix-configuration.d.ts +0 -9
  422. package/dist/src/teamcity-client/models/matrix-configuration.d.ts.map +0 -1
  423. package/dist/src/teamcity-client/models/matrix-dependencies.d.ts +0 -6
  424. package/dist/src/teamcity-client/models/matrix-dependencies.d.ts.map +0 -1
  425. package/dist/src/teamcity-client/models/matrix-dependency.d.ts +0 -7
  426. package/dist/src/teamcity-client/models/matrix-dependency.d.ts.map +0 -1
  427. package/dist/src/teamcity-client/models/matrix-parameter-descriptor.d.ts +0 -7
  428. package/dist/src/teamcity-client/models/matrix-parameter-descriptor.d.ts.map +0 -1
  429. package/dist/src/teamcity-client/models/meta-data.d.ts +0 -6
  430. package/dist/src/teamcity-client/models/meta-data.d.ts.map +0 -1
  431. package/dist/src/teamcity-client/models/metric-tag.d.ts +0 -5
  432. package/dist/src/teamcity-client/models/metric-tag.d.ts.map +0 -1
  433. package/dist/src/teamcity-client/models/metric-tags.d.ts +0 -6
  434. package/dist/src/teamcity-client/models/metric-tags.d.ts.map +0 -1
  435. package/dist/src/teamcity-client/models/metric-value.d.ts +0 -7
  436. package/dist/src/teamcity-client/models/metric-value.d.ts.map +0 -1
  437. package/dist/src/teamcity-client/models/metric-values.d.ts +0 -6
  438. package/dist/src/teamcity-client/models/metric-values.d.ts.map +0 -1
  439. package/dist/src/teamcity-client/models/metric.d.ts +0 -10
  440. package/dist/src/teamcity-client/models/metric.d.ts.map +0 -1
  441. package/dist/src/teamcity-client/models/metrics.d.ts +0 -6
  442. package/dist/src/teamcity-client/models/metrics.d.ts.map +0 -1
  443. package/dist/src/teamcity-client/models/model-file.d.ts +0 -13
  444. package/dist/src/teamcity-client/models/model-file.d.ts.map +0 -1
  445. package/dist/src/teamcity-client/models/multiple-operation-result.d.ts +0 -7
  446. package/dist/src/teamcity-client/models/multiple-operation-result.d.ts.map +0 -1
  447. package/dist/src/teamcity-client/models/mute-locator.d.ts +0 -26
  448. package/dist/src/teamcity-client/models/mute-locator.d.ts.map +0 -1
  449. package/dist/src/teamcity-client/models/mute.d.ts +0 -13
  450. package/dist/src/teamcity-client/models/mute.d.ts.map +0 -1
  451. package/dist/src/teamcity-client/models/mutes.d.ts +0 -9
  452. package/dist/src/teamcity-client/models/mutes.d.ts.map +0 -1
  453. package/dist/src/teamcity-client/models/new-build-type-description.d.ts +0 -13
  454. package/dist/src/teamcity-client/models/new-build-type-description.d.ts.map +0 -1
  455. package/dist/src/teamcity-client/models/new-project-description.d.ts +0 -15
  456. package/dist/src/teamcity-client/models/new-project-description.d.ts.map +0 -1
  457. package/dist/src/teamcity-client/models/node.d.ts +0 -21
  458. package/dist/src/teamcity-client/models/node.d.ts.map +0 -1
  459. package/dist/src/teamcity-client/models/nodes.d.ts +0 -6
  460. package/dist/src/teamcity-client/models/nodes.d.ts.map +0 -1
  461. package/dist/src/teamcity-client/models/operation-result.d.ts +0 -6
  462. package/dist/src/teamcity-client/models/operation-result.d.ts.map +0 -1
  463. package/dist/src/teamcity-client/models/parsed-test-name.d.ts +0 -10
  464. package/dist/src/teamcity-client/models/parsed-test-name.d.ts.map +0 -1
  465. package/dist/src/teamcity-client/models/permission-assignment.d.ts +0 -8
  466. package/dist/src/teamcity-client/models/permission-assignment.d.ts.map +0 -1
  467. package/dist/src/teamcity-client/models/permission-assignments.d.ts +0 -6
  468. package/dist/src/teamcity-client/models/permission-assignments.d.ts.map +0 -1
  469. package/dist/src/teamcity-client/models/permission-restriction.d.ts +0 -8
  470. package/dist/src/teamcity-client/models/permission-restriction.d.ts.map +0 -1
  471. package/dist/src/teamcity-client/models/permission-restrictions.d.ts +0 -6
  472. package/dist/src/teamcity-client/models/permission-restrictions.d.ts.map +0 -1
  473. package/dist/src/teamcity-client/models/permission.d.ts +0 -6
  474. package/dist/src/teamcity-client/models/permission.d.ts.map +0 -1
  475. package/dist/src/teamcity-client/models/permissions.d.ts +0 -6
  476. package/dist/src/teamcity-client/models/permissions.d.ts.map +0 -1
  477. package/dist/src/teamcity-client/models/pin-info.d.ts +0 -6
  478. package/dist/src/teamcity-client/models/pin-info.d.ts.map +0 -1
  479. package/dist/src/teamcity-client/models/plugin.d.ts +0 -9
  480. package/dist/src/teamcity-client/models/plugin.d.ts.map +0 -1
  481. package/dist/src/teamcity-client/models/plugins.d.ts +0 -6
  482. package/dist/src/teamcity-client/models/plugins.d.ts.map +0 -1
  483. package/dist/src/teamcity-client/models/problem-locator.d.ts +0 -15
  484. package/dist/src/teamcity-client/models/problem-locator.d.ts.map +0 -1
  485. package/dist/src/teamcity-client/models/problem-occurrence-locator.d.ts +0 -16
  486. package/dist/src/teamcity-client/models/problem-occurrence-locator.d.ts.map +0 -1
  487. package/dist/src/teamcity-client/models/problem-occurrence.d.ts +0 -20
  488. package/dist/src/teamcity-client/models/problem-occurrence.d.ts.map +0 -1
  489. package/dist/src/teamcity-client/models/problem-occurrences.d.ts +0 -14
  490. package/dist/src/teamcity-client/models/problem-occurrences.d.ts.map +0 -1
  491. package/dist/src/teamcity-client/models/problem-scope.d.ts +0 -9
  492. package/dist/src/teamcity-client/models/problem-scope.d.ts.map +0 -1
  493. package/dist/src/teamcity-client/models/problem-target.d.ts +0 -8
  494. package/dist/src/teamcity-client/models/problem-target.d.ts.map +0 -1
  495. package/dist/src/teamcity-client/models/problem.d.ts +0 -15
  496. package/dist/src/teamcity-client/models/problem.d.ts.map +0 -1
  497. package/dist/src/teamcity-client/models/problems.d.ts +0 -8
  498. package/dist/src/teamcity-client/models/problems.d.ts.map +0 -1
  499. package/dist/src/teamcity-client/models/progress-info.d.ts +0 -13
  500. package/dist/src/teamcity-client/models/progress-info.d.ts.map +0 -1
  501. package/dist/src/teamcity-client/models/project-feature.d.ts +0 -11
  502. package/dist/src/teamcity-client/models/project-feature.d.ts.map +0 -1
  503. package/dist/src/teamcity-client/models/project-features.d.ts +0 -7
  504. package/dist/src/teamcity-client/models/project-features.d.ts.map +0 -1
  505. package/dist/src/teamcity-client/models/project-locator.d.ts +0 -20
  506. package/dist/src/teamcity-client/models/project-locator.d.ts.map +0 -1
  507. package/dist/src/teamcity-client/models/project.d.ts +0 -39
  508. package/dist/src/teamcity-client/models/project.d.ts.map +0 -1
  509. package/dist/src/teamcity-client/models/projects.d.ts +0 -9
  510. package/dist/src/teamcity-client/models/projects.d.ts.map +0 -1
  511. package/dist/src/teamcity-client/models/properties.d.ts +0 -7
  512. package/dist/src/teamcity-client/models/properties.d.ts.map +0 -1
  513. package/dist/src/teamcity-client/models/property.d.ts +0 -8
  514. package/dist/src/teamcity-client/models/property.d.ts.map +0 -1
  515. package/dist/src/teamcity-client/models/related-entities.d.ts +0 -6
  516. package/dist/src/teamcity-client/models/related-entities.d.ts.map +0 -1
  517. package/dist/src/teamcity-client/models/related-entity.d.ts +0 -29
  518. package/dist/src/teamcity-client/models/related-entity.d.ts.map +0 -1
  519. package/dist/src/teamcity-client/models/related.d.ts +0 -5
  520. package/dist/src/teamcity-client/models/related.d.ts.map +0 -1
  521. package/dist/src/teamcity-client/models/repository-state.d.ts +0 -7
  522. package/dist/src/teamcity-client/models/repository-state.d.ts.map +0 -1
  523. package/dist/src/teamcity-client/models/requirements.d.ts +0 -4
  524. package/dist/src/teamcity-client/models/requirements.d.ts.map +0 -1
  525. package/dist/src/teamcity-client/models/resolution.d.ts +0 -11
  526. package/dist/src/teamcity-client/models/resolution.d.ts.map +0 -1
  527. package/dist/src/teamcity-client/models/responsibility.d.ts +0 -5
  528. package/dist/src/teamcity-client/models/responsibility.d.ts.map +0 -1
  529. package/dist/src/teamcity-client/models/revision.d.ts +0 -9
  530. package/dist/src/teamcity-client/models/revision.d.ts.map +0 -1
  531. package/dist/src/teamcity-client/models/revisions.d.ts +0 -7
  532. package/dist/src/teamcity-client/models/revisions.d.ts.map +0 -1
  533. package/dist/src/teamcity-client/models/role.d.ts +0 -6
  534. package/dist/src/teamcity-client/models/role.d.ts.map +0 -1
  535. package/dist/src/teamcity-client/models/roles.d.ts +0 -5
  536. package/dist/src/teamcity-client/models/roles.d.ts.map +0 -1
  537. package/dist/src/teamcity-client/models/server-auth-settings.d.ts +0 -12
  538. package/dist/src/teamcity-client/models/server-auth-settings.d.ts.map +0 -1
  539. package/dist/src/teamcity-client/models/server-global-settings.d.ts +0 -15
  540. package/dist/src/teamcity-client/models/server-global-settings.d.ts.map +0 -1
  541. package/dist/src/teamcity-client/models/server.d.ts +0 -26
  542. package/dist/src/teamcity-client/models/server.d.ts.map +0 -1
  543. package/dist/src/teamcity-client/models/snapshot-dependencies.d.ts +0 -6
  544. package/dist/src/teamcity-client/models/snapshot-dependencies.d.ts.map +0 -1
  545. package/dist/src/teamcity-client/models/snapshot-dependency-link.d.ts +0 -8
  546. package/dist/src/teamcity-client/models/snapshot-dependency-link.d.ts.map +0 -1
  547. package/dist/src/teamcity-client/models/snapshot-dependency.d.ts +0 -13
  548. package/dist/src/teamcity-client/models/snapshot-dependency.d.ts.map +0 -1
  549. package/dist/src/teamcity-client/models/state-field.d.ts +0 -5
  550. package/dist/src/teamcity-client/models/state-field.d.ts.map +0 -1
  551. package/dist/src/teamcity-client/models/step.d.ts +0 -12
  552. package/dist/src/teamcity-client/models/step.d.ts.map +0 -1
  553. package/dist/src/teamcity-client/models/steps.d.ts +0 -6
  554. package/dist/src/teamcity-client/models/steps.d.ts.map +0 -1
  555. package/dist/src/teamcity-client/models/tag-locator.d.ts +0 -6
  556. package/dist/src/teamcity-client/models/tag-locator.d.ts.map +0 -1
  557. package/dist/src/teamcity-client/models/tag.d.ts +0 -7
  558. package/dist/src/teamcity-client/models/tag.d.ts.map +0 -1
  559. package/dist/src/teamcity-client/models/tags.d.ts +0 -6
  560. package/dist/src/teamcity-client/models/tags.d.ts.map +0 -1
  561. package/dist/src/teamcity-client/models/team-city-node-locator.d.ts +0 -6
  562. package/dist/src/teamcity-client/models/team-city-node-locator.d.ts.map +0 -1
  563. package/dist/src/teamcity-client/models/test-counters.d.ts +0 -10
  564. package/dist/src/teamcity-client/models/test-counters.d.ts.map +0 -1
  565. package/dist/src/teamcity-client/models/test-locator.d.ts +0 -14
  566. package/dist/src/teamcity-client/models/test-locator.d.ts.map +0 -1
  567. package/dist/src/teamcity-client/models/test-occurrence-locator.d.ts +0 -31
  568. package/dist/src/teamcity-client/models/test-occurrence-locator.d.ts.map +0 -1
  569. package/dist/src/teamcity-client/models/test-occurrence.d.ts +0 -37
  570. package/dist/src/teamcity-client/models/test-occurrence.d.ts.map +0 -1
  571. package/dist/src/teamcity-client/models/test-occurrences.d.ts +0 -16
  572. package/dist/src/teamcity-client/models/test-occurrences.d.ts.map +0 -1
  573. package/dist/src/teamcity-client/models/test-run-metadata.d.ts +0 -6
  574. package/dist/src/teamcity-client/models/test-run-metadata.d.ts.map +0 -1
  575. package/dist/src/teamcity-client/models/tests.d.ts +0 -10
  576. package/dist/src/teamcity-client/models/tests.d.ts.map +0 -1
  577. package/dist/src/teamcity-client/models/token.d.ts +0 -9
  578. package/dist/src/teamcity-client/models/token.d.ts.map +0 -1
  579. package/dist/src/teamcity-client/models/tokens.d.ts +0 -6
  580. package/dist/src/teamcity-client/models/tokens.d.ts.map +0 -1
  581. package/dist/src/teamcity-client/models/trigger.d.ts +0 -13
  582. package/dist/src/teamcity-client/models/trigger.d.ts.map +0 -1
  583. package/dist/src/teamcity-client/models/triggered-by.d.ts +0 -16
  584. package/dist/src/teamcity-client/models/triggered-by.d.ts.map +0 -1
  585. package/dist/src/teamcity-client/models/triggers.d.ts +0 -6
  586. package/dist/src/teamcity-client/models/triggers.d.ts.map +0 -1
  587. package/dist/src/teamcity-client/models/type.d.ts +0 -4
  588. package/dist/src/teamcity-client/models/type.d.ts.map +0 -1
  589. package/dist/src/teamcity-client/models/typed-value-set.d.ts +0 -10
  590. package/dist/src/teamcity-client/models/typed-value-set.d.ts.map +0 -1
  591. package/dist/src/teamcity-client/models/typed-value-sets.d.ts +0 -6
  592. package/dist/src/teamcity-client/models/typed-value-sets.d.ts.map +0 -1
  593. package/dist/src/teamcity-client/models/typed-value.d.ts +0 -6
  594. package/dist/src/teamcity-client/models/typed-value.d.ts.map +0 -1
  595. package/dist/src/teamcity-client/models/user-approval-rule.d.ts +0 -6
  596. package/dist/src/teamcity-client/models/user-approval-rule.d.ts.map +0 -1
  597. package/dist/src/teamcity-client/models/user-approvals.d.ts +0 -6
  598. package/dist/src/teamcity-client/models/user-approvals.d.ts.map +0 -1
  599. package/dist/src/teamcity-client/models/user-avatars.d.ts +0 -10
  600. package/dist/src/teamcity-client/models/user-avatars.d.ts.map +0 -1
  601. package/dist/src/teamcity-client/models/user-group-locator.d.ts +0 -6
  602. package/dist/src/teamcity-client/models/user-group-locator.d.ts.map +0 -1
  603. package/dist/src/teamcity-client/models/user-locator.d.ts +0 -15
  604. package/dist/src/teamcity-client/models/user-locator.d.ts.map +0 -1
  605. package/dist/src/teamcity-client/models/user.d.ts +0 -22
  606. package/dist/src/teamcity-client/models/user.d.ts.map +0 -1
  607. package/dist/src/teamcity-client/models/users.d.ts +0 -6
  608. package/dist/src/teamcity-client/models/users.d.ts.map +0 -1
  609. package/dist/src/teamcity-client/models/vcs-check-status.d.ts +0 -6
  610. package/dist/src/teamcity-client/models/vcs-check-status.d.ts.map +0 -1
  611. package/dist/src/teamcity-client/models/vcs-label.d.ts +0 -18
  612. package/dist/src/teamcity-client/models/vcs-label.d.ts.map +0 -1
  613. package/dist/src/teamcity-client/models/vcs-labels.d.ts +0 -6
  614. package/dist/src/teamcity-client/models/vcs-labels.d.ts.map +0 -1
  615. package/dist/src/teamcity-client/models/vcs-root-entries.d.ts +0 -6
  616. package/dist/src/teamcity-client/models/vcs-root-entries.d.ts.map +0 -1
  617. package/dist/src/teamcity-client/models/vcs-root-entry.d.ts +0 -8
  618. package/dist/src/teamcity-client/models/vcs-root-entry.d.ts.map +0 -1
  619. package/dist/src/teamcity-client/models/vcs-root-instance-locator.d.ts +0 -38
  620. package/dist/src/teamcity-client/models/vcs-root-instance-locator.d.ts.map +0 -1
  621. package/dist/src/teamcity-client/models/vcs-root-instance.d.ts +0 -24
  622. package/dist/src/teamcity-client/models/vcs-root-instance.d.ts.map +0 -1
  623. package/dist/src/teamcity-client/models/vcs-root-instances.d.ts +0 -9
  624. package/dist/src/teamcity-client/models/vcs-root-instances.d.ts.map +0 -1
  625. package/dist/src/teamcity-client/models/vcs-root-locator.d.ts +0 -37
  626. package/dist/src/teamcity-client/models/vcs-root-locator.d.ts.map +0 -1
  627. package/dist/src/teamcity-client/models/vcs-root.d.ts +0 -20
  628. package/dist/src/teamcity-client/models/vcs-root.d.ts.map +0 -1
  629. package/dist/src/teamcity-client/models/vcs-roots.d.ts +0 -9
  630. package/dist/src/teamcity-client/models/vcs-roots.d.ts.map +0 -1
  631. package/dist/src/teamcity-client/models/vcs-status.d.ts +0 -6
  632. package/dist/src/teamcity-client/models/vcs-status.d.ts.map +0 -1
  633. package/dist/src/teamcity-client/models/versioned-settings-config.d.ts +0 -31
  634. package/dist/src/teamcity-client/models/versioned-settings-config.d.ts.map +0 -1
  635. package/dist/src/teamcity-client/models/versioned-settings-context-parameter.d.ts +0 -5
  636. package/dist/src/teamcity-client/models/versioned-settings-context-parameter.d.ts.map +0 -1
  637. package/dist/src/teamcity-client/models/versioned-settings-context-parameters.d.ts +0 -5
  638. package/dist/src/teamcity-client/models/versioned-settings-context-parameters.d.ts.map +0 -1
  639. package/dist/src/teamcity-client/models/versioned-settings-error.d.ts +0 -7
  640. package/dist/src/teamcity-client/models/versioned-settings-error.d.ts.map +0 -1
  641. package/dist/src/teamcity-client/models/versioned-settings-status.d.ts +0 -15
  642. package/dist/src/teamcity-client/models/versioned-settings-status.d.ts.map +0 -1
  643. package/dist/src/teamcity-client/models/versioned-settings-token.d.ts +0 -6
  644. package/dist/src/teamcity-client/models/versioned-settings-token.d.ts.map +0 -1
  645. package/dist/src/teamcity-client/models/versioned-settings-tokens.d.ts +0 -5
  646. package/dist/src/teamcity-client/models/versioned-settings-tokens.d.ts.map +0 -1
  647. package/dist/src/tools/index.d.ts +0 -2
  648. package/dist/src/tools/index.d.ts.map +0 -1
  649. package/dist/src/tools.d.ts +0 -22
  650. package/dist/src/tools.d.ts.map +0 -1
  651. package/dist/src/types/config.d.ts +0 -129
  652. package/dist/src/types/config.d.ts.map +0 -1
  653. package/dist/src/types/index.d.ts +0 -116
  654. package/dist/src/types/index.d.ts.map +0 -1
  655. package/dist/src/types/mcp.d.ts +0 -68
  656. package/dist/src/types/mcp.d.ts.map +0 -1
  657. package/dist/src/types/project.d.ts +0 -56
  658. package/dist/src/types/project.d.ts.map +0 -1
  659. package/dist/src/types/teamcity.d.ts +0 -258
  660. package/dist/src/types/teamcity.d.ts.map +0 -1
  661. package/dist/src/utils/async/index.d.ts +0 -90
  662. package/dist/src/utils/async/index.d.ts.map +0 -1
  663. package/dist/src/utils/error-logger.d.ts +0 -34
  664. package/dist/src/utils/error-logger.d.ts.map +0 -1
  665. package/dist/src/utils/index.d.ts +0 -23
  666. package/dist/src/utils/index.d.ts.map +0 -1
  667. package/dist/src/utils/logger/index.d.ts +0 -73
  668. package/dist/src/utils/logger/index.d.ts.map +0 -1
  669. package/dist/src/utils/logger.d.ts +0 -11
  670. package/dist/src/utils/logger.d.ts.map +0 -1
  671. package/dist/src/utils/lru-cache.d.ts +0 -20
  672. package/dist/src/utils/lru-cache.d.ts.map +0 -1
  673. package/dist/src/utils/mcp.d.ts +0 -18
  674. package/dist/src/utils/mcp.d.ts.map +0 -1
  675. package/dist/src/utils/validation.d.ts +0 -61
  676. package/dist/src/utils/validation.d.ts.map +0 -1
  677. package/docs/TEAMCITY_MCP_TOOLS_GUIDE.md +0 -1076
  678. package/docs/mcp-tools-mode-matrix.md +0 -68
  679. package/docs/mcp-tools-reference.md +0 -203
  680. package/examples/list-build-configs-usage.ts +0 -276
  681. package/jest.ci.config.js +0 -14
  682. package/jest.config.js +0 -108
  683. package/jest.setup.js +0 -24
  684. package/openapi-generator-config.json +0 -27
  685. package/openapitools.json +0 -7
  686. package/scripts/build.cjs +0 -106
  687. package/scripts/debug-fetch-log.ts +0 -52
  688. package/scripts/emit-coverage-stats.js +0 -42
  689. package/scripts/fetch-swagger-spec.ts +0 -140
  690. package/scripts/generate-third-party-notices.cjs +0 -71
  691. package/scripts/interact.sh +0 -23
  692. package/scripts/print-builds.ts +0 -21
  693. package/scripts/verify-integration-env.cjs +0 -29
  694. package/src/api-client.ts +0 -307
  695. package/src/config/index.ts +0 -286
  696. package/src/errors/index.ts +0 -25
  697. package/src/formatters/build-step-formatter.ts +0 -178
  698. package/src/formatters/trigger-formatter.ts +0 -207
  699. package/src/index.ts +0 -60
  700. package/src/middleware/error.test.ts +0 -274
  701. package/src/middleware/error.ts +0 -314
  702. package/src/middleware/global-error-handler.test.ts +0 -239
  703. package/src/middleware/global-error-handler.ts +0 -214
  704. package/src/middleware/index.ts +0 -5
  705. package/src/server.ts +0 -126
  706. package/src/swagger/index.ts +0 -220
  707. package/src/swagger/swagger-cache.ts +0 -220
  708. package/src/swagger/swagger-fetcher.ts +0 -126
  709. package/src/swagger/swagger-validator.ts +0 -212
  710. package/src/teamcity/api-types.ts +0 -387
  711. package/src/teamcity/artifact-manager.ts +0 -362
  712. package/src/teamcity/auth.ts +0 -219
  713. package/src/teamcity/branch-discovery-manager.ts +0 -311
  714. package/src/teamcity/branch-filtering-service.ts +0 -369
  715. package/src/teamcity/branch-specification-parser.ts +0 -238
  716. package/src/teamcity/build-config-manager.ts +0 -458
  717. package/src/teamcity/build-config-navigator.ts +0 -589
  718. package/src/teamcity/build-configuration-clone-manager.ts +0 -501
  719. package/src/teamcity/build-configuration-manager.ts +0 -447
  720. package/src/teamcity/build-configuration-resolver.ts +0 -725
  721. package/src/teamcity/build-configuration-update-manager.ts +0 -610
  722. package/src/teamcity/build-list-manager.ts +0 -313
  723. package/src/teamcity/build-parameters-manager.ts +0 -875
  724. package/src/teamcity/build-progress-tracker.ts +0 -514
  725. package/src/teamcity/build-query-builder.ts +0 -325
  726. package/src/teamcity/build-queue-manager.ts +0 -622
  727. package/src/teamcity/build-results-manager.ts +0 -589
  728. package/src/teamcity/build-status-manager.ts +0 -564
  729. package/src/teamcity/build-step-manager.ts +0 -508
  730. package/src/teamcity/build-trigger-manager.ts +0 -1083
  731. package/src/teamcity/circuit-breaker.ts +0 -219
  732. package/src/teamcity/client-adapter.ts +0 -35
  733. package/src/teamcity/client.ts +0 -269
  734. package/src/teamcity/config.ts +0 -188
  735. package/src/teamcity/configuration-branch-matcher.ts +0 -327
  736. package/src/teamcity/errors.ts +0 -351
  737. package/src/teamcity/index.ts +0 -266
  738. package/src/teamcity/pagination.ts +0 -209
  739. package/src/teamcity/project-list-manager.ts +0 -267
  740. package/src/teamcity/project-manager.ts +0 -493
  741. package/src/teamcity/project-navigator.ts +0 -664
  742. package/src/teamcity/test-problem-reporter.ts +0 -423
  743. package/src/teamcity/types/api-responses.ts +0 -314
  744. package/src/teamcity-client/.openapi-generator/FILES +0 -274
  745. package/src/teamcity-client/.openapi-generator/VERSION +0 -1
  746. package/src/teamcity-client/.openapi-generator-ignore +0 -23
  747. package/src/teamcity-client/README.md +0 -50
  748. package/src/teamcity-client/api/agent-api.ts +0 -2046
  749. package/src/teamcity-client/api/agent-pool-api.ts +0 -1877
  750. package/src/teamcity-client/api/agent-type-api.ts +0 -213
  751. package/src/teamcity-client/api/audit-api.ts +0 -341
  752. package/src/teamcity-client/api/avatar-api.ts +0 -569
  753. package/src/teamcity-client/api/build-api.ts +0 -7726
  754. package/src/teamcity-client/api/build-queue-api.ts +0 -1922
  755. package/src/teamcity-client/api/build-type-api.ts +0 -15502
  756. package/src/teamcity-client/api/change-api.ts +0 -1311
  757. package/src/teamcity-client/api/cloud-instance-api.ts +0 -1289
  758. package/src/teamcity-client/api/deployment-dashboard-api.ts +0 -1295
  759. package/src/teamcity-client/api/global-server-settings-api.ts +0 -286
  760. package/src/teamcity-client/api/group-api.ts +0 -2084
  761. package/src/teamcity-client/api/health-api.ts +0 -566
  762. package/src/teamcity-client/api/investigation-api.ts +0 -856
  763. package/src/teamcity-client/api/mute-api.ts +0 -824
  764. package/src/teamcity-client/api/node-api.ts +0 -877
  765. package/src/teamcity-client/api/problem-api.ts +0 -337
  766. package/src/teamcity-client/api/problem-occurrence-api.ts +0 -349
  767. package/src/teamcity-client/api/project-api.ts +0 -6511
  768. package/src/teamcity-client/api/role-api.ts +0 -1062
  769. package/src/teamcity-client/api/root-api.ts +0 -439
  770. package/src/teamcity-client/api/server-api.ts +0 -2306
  771. package/src/teamcity-client/api/server-authentication-settings-api.ts +0 -289
  772. package/src/teamcity-client/api/test-api.ts +0 -329
  773. package/src/teamcity-client/api/test-occurrence-api.ts +0 -340
  774. package/src/teamcity-client/api/user-api.ts +0 -3644
  775. package/src/teamcity-client/api/vcs-root-api.ts +0 -1837
  776. package/src/teamcity-client/api/vcs-root-instance-api.ts +0 -2479
  777. package/src/teamcity-client/api/versioned-settings-api.ts +0 -2025
  778. package/src/teamcity-client/api.ts +0 -44
  779. package/src/teamcity-client/base.ts +0 -91
  780. package/src/teamcity-client/common.ts +0 -197
  781. package/src/teamcity-client/configuration.ts +0 -130
  782. package/src/teamcity-client/git_push.sh +0 -57
  783. package/src/teamcity-client/index.ts +0 -17
  784. package/src/teamcity-client/models/agent-locator.ts +0 -124
  785. package/src/teamcity-client/models/agent-pool-locator.ts +0 -63
  786. package/src/teamcity-client/models/agent-pool.ts +0 -87
  787. package/src/teamcity-client/models/agent-pools.ts +0 -54
  788. package/src/teamcity-client/models/agent-requirement.ts +0 -66
  789. package/src/teamcity-client/models/agent-requirements.ts +0 -36
  790. package/src/teamcity-client/models/agent-type-locator.ts +0 -51
  791. package/src/teamcity-client/models/agent-type.ts +0 -81
  792. package/src/teamcity-client/models/agent-types.ts +0 -54
  793. package/src/teamcity-client/models/agent.ts +0 -295
  794. package/src/teamcity-client/models/agents.ts +0 -54
  795. package/src/teamcity-client/models/approvable-build.ts +0 -39
  796. package/src/teamcity-client/models/approval-info.ts +0 -100
  797. package/src/teamcity-client/models/artifact-dependencies.ts +0 -42
  798. package/src/teamcity-client/models/artifact-dependency.ts +0 -75
  799. package/src/teamcity-client/models/artifact-download-info.ts +0 -33
  800. package/src/teamcity-client/models/audit-action.ts +0 -39
  801. package/src/teamcity-client/models/audit-event.ts +0 -66
  802. package/src/teamcity-client/models/audit-events.ts +0 -54
  803. package/src/teamcity-client/models/audit-locator.ts +0 -315
  804. package/src/teamcity-client/models/auth-module.ts +0 -36
  805. package/src/teamcity-client/models/auth-modules.ts +0 -30
  806. package/src/teamcity-client/models/authorization-tokens-requirements.ts +0 -33
  807. package/src/teamcity-client/models/authorized-info.ts +0 -36
  808. package/src/teamcity-client/models/branch-locator.ts +0 -117
  809. package/src/teamcity-client/models/branch-version.ts +0 -78
  810. package/src/teamcity-client/models/branch.ts +0 -72
  811. package/src/teamcity-client/models/branches.ts +0 -42
  812. package/src/teamcity-client/models/build-cancel-request.ts +0 -33
  813. package/src/teamcity-client/models/build-change.ts +0 -36
  814. package/src/teamcity-client/models/build-changes.ts +0 -36
  815. package/src/teamcity-client/models/build-executor.ts +0 -27
  816. package/src/teamcity-client/models/build-locator.ts +0 -277
  817. package/src/teamcity-client/models/build-queue-locator.ts +0 -87
  818. package/src/teamcity-client/models/build-status-update.ts +0 -33
  819. package/src/teamcity-client/models/build-trigger-customization.ts +0 -42
  820. package/src/teamcity-client/models/build-triggering-options.ts +0 -72
  821. package/src/teamcity-client/models/build-type-locator.ts +0 -111
  822. package/src/teamcity-client/models/build-type.ts +0 -305
  823. package/src/teamcity-client/models/build-types.ts +0 -54
  824. package/src/teamcity-client/models/build.ts +0 -631
  825. package/src/teamcity-client/models/builds-with-reason.ts +0 -36
  826. package/src/teamcity-client/models/builds.ts +0 -54
  827. package/src/teamcity-client/models/change-locator.ts +0 -129
  828. package/src/teamcity-client/models/change-status.ts +0 -114
  829. package/src/teamcity-client/models/change.ts +0 -186
  830. package/src/teamcity-client/models/changes.ts +0 -54
  831. package/src/teamcity-client/models/cleanup.ts +0 -51
  832. package/src/teamcity-client/models/cloud-error.ts +0 -33
  833. package/src/teamcity-client/models/cloud-image-locator.ts +0 -105
  834. package/src/teamcity-client/models/cloud-image.ts +0 -102
  835. package/src/teamcity-client/models/cloud-images.ts +0 -54
  836. package/src/teamcity-client/models/cloud-instance-locator.ts +0 -81
  837. package/src/teamcity-client/models/cloud-instance.ts +0 -90
  838. package/src/teamcity-client/models/cloud-instances.ts +0 -54
  839. package/src/teamcity-client/models/cloud-profile-locator.ts +0 -81
  840. package/src/teamcity-client/models/cloud-profile.ts +0 -72
  841. package/src/teamcity-client/models/cloud-profiles.ts +0 -54
  842. package/src/teamcity-client/models/comment.ts +0 -42
  843. package/src/teamcity-client/models/commiter.ts +0 -36
  844. package/src/teamcity-client/models/compatibilities.ts +0 -36
  845. package/src/teamcity-client/models/compatibility-policy.ts +0 -36
  846. package/src/teamcity-client/models/compatibility.ts +0 -54
  847. package/src/teamcity-client/models/composite-approval-rule.ts +0 -54
  848. package/src/teamcity-client/models/composite-approvals.ts +0 -36
  849. package/src/teamcity-client/models/cron.ts +0 -51
  850. package/src/teamcity-client/models/customizations.ts +0 -45
  851. package/src/teamcity-client/models/daily.ts +0 -33
  852. package/src/teamcity-client/models/datas.ts +0 -36
  853. package/src/teamcity-client/models/deployment-dashboard-locator.ts +0 -57
  854. package/src/teamcity-client/models/deployment-dashboard.ts +0 -51
  855. package/src/teamcity-client/models/deployment-dashboards.ts +0 -54
  856. package/src/teamcity-client/models/deployment-history.ts +0 -36
  857. package/src/teamcity-client/models/deployment-instance-locator.ts +0 -62
  858. package/src/teamcity-client/models/deployment-instance.ts +0 -68
  859. package/src/teamcity-client/models/deployment-instances.ts +0 -54
  860. package/src/teamcity-client/models/deployment-state-entries.ts +0 -45
  861. package/src/teamcity-client/models/deployment-state-entry.ts +0 -59
  862. package/src/teamcity-client/models/disabled-responsibilities.ts +0 -36
  863. package/src/teamcity-client/models/download-info.ts +0 -45
  864. package/src/teamcity-client/models/downloaded-artifacts.ts +0 -42
  865. package/src/teamcity-client/models/effective-responsibilities.ts +0 -36
  866. package/src/teamcity-client/models/enabled-info.ts +0 -42
  867. package/src/teamcity-client/models/enabled-responsibilities.ts +0 -36
  868. package/src/teamcity-client/models/entries.ts +0 -36
  869. package/src/teamcity-client/models/entry.ts +0 -33
  870. package/src/teamcity-client/models/environment.ts +0 -33
  871. package/src/teamcity-client/models/feature.ts +0 -66
  872. package/src/teamcity-client/models/features.ts +0 -36
  873. package/src/teamcity-client/models/file-change.ts +0 -63
  874. package/src/teamcity-client/models/file-changes.ts +0 -36
  875. package/src/teamcity-client/models/files.ts +0 -39
  876. package/src/teamcity-client/models/group-approval-rule.ts +0 -45
  877. package/src/teamcity-client/models/group-approvals.ts +0 -36
  878. package/src/teamcity-client/models/group.ts +0 -87
  879. package/src/teamcity-client/models/groups.ts +0 -36
  880. package/src/teamcity-client/models/health-categories.ts +0 -54
  881. package/src/teamcity-client/models/health-category.ts +0 -45
  882. package/src/teamcity-client/models/health-item.ts +0 -51
  883. package/src/teamcity-client/models/health-status-items.ts +0 -54
  884. package/src/teamcity-client/models/href.ts +0 -27
  885. package/src/teamcity-client/models/index.ts +0 -229
  886. package/src/teamcity-client/models/investigation-locator.ts +0 -125
  887. package/src/teamcity-client/models/investigation.ts +0 -100
  888. package/src/teamcity-client/models/investigations.ts +0 -54
  889. package/src/teamcity-client/models/issue-usage.ts +0 -39
  890. package/src/teamcity-client/models/issue.ts +0 -33
  891. package/src/teamcity-client/models/issues-usages.ts +0 -42
  892. package/src/teamcity-client/models/issues.ts +0 -30
  893. package/src/teamcity-client/models/items.ts +0 -27
  894. package/src/teamcity-client/models/labeled-value.ts +0 -33
  895. package/src/teamcity-client/models/license-key.ts +0 -134
  896. package/src/teamcity-client/models/license-keys.ts +0 -42
  897. package/src/teamcity-client/models/licensing-data.ts +0 -114
  898. package/src/teamcity-client/models/link.ts +0 -39
  899. package/src/teamcity-client/models/links.ts +0 -36
  900. package/src/teamcity-client/models/matrix-build-feature-descriptor.ts +0 -48
  901. package/src/teamcity-client/models/matrix-configuration.ts +0 -51
  902. package/src/teamcity-client/models/matrix-dependencies.ts +0 -36
  903. package/src/teamcity-client/models/matrix-dependency.ts +0 -39
  904. package/src/teamcity-client/models/matrix-parameter-descriptor.ts +0 -42
  905. package/src/teamcity-client/models/meta-data.ts +0 -36
  906. package/src/teamcity-client/models/metric-tag.ts +0 -33
  907. package/src/teamcity-client/models/metric-tags.ts +0 -36
  908. package/src/teamcity-client/models/metric-value.ts +0 -42
  909. package/src/teamcity-client/models/metric-values.ts +0 -36
  910. package/src/teamcity-client/models/metric.ts +0 -57
  911. package/src/teamcity-client/models/metrics.ts +0 -36
  912. package/src/teamcity-client/models/model-file.ts +0 -75
  913. package/src/teamcity-client/models/multiple-operation-result.ts +0 -42
  914. package/src/teamcity-client/models/mute-locator.ts +0 -108
  915. package/src/teamcity-client/models/mute.ts +0 -69
  916. package/src/teamcity-client/models/mutes.ts +0 -54
  917. package/src/teamcity-client/models/new-build-type-description.ts +0 -75
  918. package/src/teamcity-client/models/new-project-description.ts +0 -87
  919. package/src/teamcity-client/models/node.ts +0 -87
  920. package/src/teamcity-client/models/nodes.ts +0 -36
  921. package/src/teamcity-client/models/operation-result.ts +0 -36
  922. package/src/teamcity-client/models/parsed-test-name.ts +0 -63
  923. package/src/teamcity-client/models/permission-assignment.ts +0 -45
  924. package/src/teamcity-client/models/permission-assignments.ts +0 -36
  925. package/src/teamcity-client/models/permission-restriction.ts +0 -45
  926. package/src/teamcity-client/models/permission-restrictions.ts +0 -36
  927. package/src/teamcity-client/models/permission.ts +0 -39
  928. package/src/teamcity-client/models/permissions.ts +0 -36
  929. package/src/teamcity-client/models/pin-info.ts +0 -36
  930. package/src/teamcity-client/models/plugin.ts +0 -54
  931. package/src/teamcity-client/models/plugins.ts +0 -36
  932. package/src/teamcity-client/models/problem-locator.ts +0 -93
  933. package/src/teamcity-client/models/problem-occurrence-locator.ts +0 -99
  934. package/src/teamcity-client/models/problem-occurrence.ts +0 -114
  935. package/src/teamcity-client/models/problem-occurrences.ts +0 -84
  936. package/src/teamcity-client/models/problem-scope.ts +0 -48
  937. package/src/teamcity-client/models/problem-target.ts +0 -45
  938. package/src/teamcity-client/models/problem.ts +0 -84
  939. package/src/teamcity-client/models/problems.ts +0 -48
  940. package/src/teamcity-client/models/progress-info.ts +0 -78
  941. package/src/teamcity-client/models/project-feature.ts +0 -66
  942. package/src/teamcity-client/models/project-features.ts +0 -42
  943. package/src/teamcity-client/models/project-locator.ts +0 -123
  944. package/src/teamcity-client/models/project.ts +0 -207
  945. package/src/teamcity-client/models/projects.ts +0 -54
  946. package/src/teamcity-client/models/properties.ts +0 -42
  947. package/src/teamcity-client/models/property.ts +0 -48
  948. package/src/teamcity-client/models/related-entities.ts +0 -36
  949. package/src/teamcity-client/models/related-entity.ts +0 -144
  950. package/src/teamcity-client/models/related.ts +0 -30
  951. package/src/teamcity-client/models/repository-state.ts +0 -42
  952. package/src/teamcity-client/models/requirements.ts +0 -27
  953. package/src/teamcity-client/models/resolution.ts +0 -41
  954. package/src/teamcity-client/models/responsibility.ts +0 -33
  955. package/src/teamcity-client/models/revision.ts +0 -54
  956. package/src/teamcity-client/models/revisions.ts +0 -42
  957. package/src/teamcity-client/models/role.ts +0 -39
  958. package/src/teamcity-client/models/roles.ts +0 -30
  959. package/src/teamcity-client/models/server-auth-settings.ts +0 -72
  960. package/src/teamcity-client/models/server-global-settings.ts +0 -93
  961. package/src/teamcity-client/models/server.ts +0 -156
  962. package/src/teamcity-client/models/snapshot-dependencies.ts +0 -36
  963. package/src/teamcity-client/models/snapshot-dependency-link.ts +0 -45
  964. package/src/teamcity-client/models/snapshot-dependency.ts +0 -75
  965. package/src/teamcity-client/models/state-field.ts +0 -33
  966. package/src/teamcity-client/models/step.ts +0 -72
  967. package/src/teamcity-client/models/steps.ts +0 -36
  968. package/src/teamcity-client/models/tag-locator.ts +0 -39
  969. package/src/teamcity-client/models/tag.ts +0 -42
  970. package/src/teamcity-client/models/tags.ts +0 -36
  971. package/src/teamcity-client/models/team-city-node-locator.ts +0 -39
  972. package/src/teamcity-client/models/test-counters.ts +0 -63
  973. package/src/teamcity-client/models/test-locator.ts +0 -87
  974. package/src/teamcity-client/models/test-occurrence-locator.ts +0 -147
  975. package/src/teamcity-client/models/test-occurrence.ts +0 -173
  976. package/src/teamcity-client/models/test-occurrences.ts +0 -93
  977. package/src/teamcity-client/models/test-run-metadata.ts +0 -36
  978. package/src/teamcity-client/models/tests.ts +0 -57
  979. package/src/teamcity-client/models/token.ts +0 -54
  980. package/src/teamcity-client/models/tokens.ts +0 -36
  981. package/src/teamcity-client/models/trigger.ts +0 -75
  982. package/src/teamcity-client/models/triggered-by.ts +0 -87
  983. package/src/teamcity-client/models/triggers.ts +0 -36
  984. package/src/teamcity-client/models/type.ts +0 -27
  985. package/src/teamcity-client/models/typed-value-set.ts +0 -60
  986. package/src/teamcity-client/models/typed-value-sets.ts +0 -36
  987. package/src/teamcity-client/models/typed-value.ts +0 -39
  988. package/src/teamcity-client/models/user-approval-rule.ts +0 -36
  989. package/src/teamcity-client/models/user-approvals.ts +0 -36
  990. package/src/teamcity-client/models/user-avatars.ts +0 -63
  991. package/src/teamcity-client/models/user-group-locator.ts +0 -39
  992. package/src/teamcity-client/models/user-locator.ts +0 -93
  993. package/src/teamcity-client/models/user.ts +0 -123
  994. package/src/teamcity-client/models/users.ts +0 -36
  995. package/src/teamcity-client/models/vcs-check-status.ts +0 -39
  996. package/src/teamcity-client/models/vcs-label.ts +0 -65
  997. package/src/teamcity-client/models/vcs-labels.ts +0 -36
  998. package/src/teamcity-client/models/vcs-root-entries.ts +0 -36
  999. package/src/teamcity-client/models/vcs-root-entry.ts +0 -48
  1000. package/src/teamcity-client/models/vcs-root-instance-locator.ts +0 -124
  1001. package/src/teamcity-client/models/vcs-root-instance.ts +0 -132
  1002. package/src/teamcity-client/models/vcs-root-instances.ts +0 -54
  1003. package/src/teamcity-client/models/vcs-root-locator.ts +0 -118
  1004. package/src/teamcity-client/models/vcs-root.ts +0 -111
  1005. package/src/teamcity-client/models/vcs-roots.ts +0 -54
  1006. package/src/teamcity-client/models/vcs-status.ts +0 -36
  1007. package/src/teamcity-client/models/versioned-settings-config.ts +0 -111
  1008. package/src/teamcity-client/models/versioned-settings-context-parameter.ts +0 -33
  1009. package/src/teamcity-client/models/versioned-settings-context-parameters.ts +0 -30
  1010. package/src/teamcity-client/models/versioned-settings-error.ts +0 -45
  1011. package/src/teamcity-client/models/versioned-settings-status.ts +0 -68
  1012. package/src/teamcity-client/models/versioned-settings-token.ts +0 -39
  1013. package/src/teamcity-client/models/versioned-settings-tokens.ts +0 -30
  1014. package/src/teamcity-client/package.json +0 -33
  1015. package/src/teamcity-client/tsconfig.esm.json +0 -7
  1016. package/src/teamcity-client/tsconfig.json +0 -13
  1017. package/src/teamcity-client-types.d.ts +0 -27
  1018. package/src/tools/index.ts +0 -2
  1019. package/src/tools.ts +0 -2904
  1020. package/src/types/config.ts +0 -140
  1021. package/src/types/index.ts +0 -171
  1022. package/src/types/mcp.ts +0 -80
  1023. package/src/types/project.ts +0 -128
  1024. package/src/types/teamcity.ts +0 -289
  1025. package/src/utils/async/index.test.ts +0 -664
  1026. package/src/utils/async/index.ts +0 -578
  1027. package/src/utils/error-logger.test.ts +0 -173
  1028. package/src/utils/error-logger.ts +0 -145
  1029. package/src/utils/index.ts +0 -88
  1030. package/src/utils/logger/index.test.ts +0 -271
  1031. package/src/utils/logger/index.ts +0 -441
  1032. package/src/utils/logger.ts +0 -49
  1033. package/src/utils/lru-cache.ts +0 -105
  1034. package/src/utils/mcp.ts +0 -84
  1035. package/src/utils/validation.ts +0 -284
  1036. package/tests/__mocks__/@modelcontextprotocol/sdk/server/index.js +0 -31
  1037. package/tests/__mocks__/@modelcontextprotocol/sdk/server/stdio.js +0 -12
  1038. package/tests/__mocks__/@modelcontextprotocol/sdk/types.js +0 -16
  1039. package/tests/development-tooling.test.ts +0 -207
  1040. package/tests/e2e/cleanup.ts +0 -68
  1041. package/tests/e2e/index.ts +0 -166
  1042. package/tests/e2e/mcp-client.ts +0 -73
  1043. package/tests/e2e/setup-playground.ts +0 -67
  1044. package/tests/integration/branches-and-queue-scenario.test.ts +0 -108
  1045. package/tests/integration/build-config-clone-update-scenario.test.ts +0 -80
  1046. package/tests/integration/build-results-and-logs-scenario.test.ts +0 -136
  1047. package/tests/integration/dev-tools-list.test.ts +0 -103
  1048. package/tests/integration/e2e-scenario.test.ts +0 -147
  1049. package/tests/integration/lib/mcp-runner.ts +0 -59
  1050. package/tests/integration/parameters-scenario.test.ts +0 -85
  1051. package/tests/integration/pause-configs-scenario.test.ts +0 -74
  1052. package/tests/integration/queue-maintenance-scenario.test.ts +0 -132
  1053. package/tests/integration/server-health-scenario.test.ts +0 -59
  1054. package/tests/integration/triggers-scenario.test.ts +0 -80
  1055. package/tests/integration/vcs-scenario.test.ts +0 -78
  1056. package/tests/jest.test.js +0 -122
  1057. package/tests/mcp-server.test.ts +0 -378
  1058. package/tests/setup.test.js +0 -97
  1059. package/tests/setup.ts +0 -88
  1060. package/tests/swagger/swagger-fetcher.test.ts +0 -619
  1061. package/tests/teamcity/auth.test.ts +0 -276
  1062. package/tests/teamcity/circuit-breaker.test.ts +0 -304
  1063. package/tests/teamcity/errors.test.ts +0 -221
  1064. package/tests/test-utils/mock-logger.ts +0 -15
  1065. package/tests/test-utils/mock-teamcity-client.ts +0 -403
  1066. package/tests/testing-infrastructure.test.ts +0 -209
  1067. package/tests/tooling.test.js +0 -118
  1068. package/tests/types/shims.d.ts +0 -20
  1069. package/tests/types/tool-results.ts +0 -68
  1070. package/tests/typescript.test.js +0 -108
  1071. package/tests/unit/mcp/server-lifecycle.test.ts +0 -301
  1072. package/tests/unit/middleware/error.test.ts +0 -283
  1073. package/tests/unit/server.test.ts +0 -102
  1074. package/tests/unit/swagger/swagger-manager.test.ts +0 -89
  1075. package/tests/unit/teamcity/artifact-manager.test.ts +0 -450
  1076. package/tests/unit/teamcity/branch-discovery-manager.test.ts +0 -561
  1077. package/tests/unit/teamcity/branch-filtering-service.test.ts +0 -481
  1078. package/tests/unit/teamcity/branch-specification-parser.test.ts +0 -443
  1079. package/tests/unit/teamcity/build-config-navigator-more.test.ts +0 -245
  1080. package/tests/unit/teamcity/build-config-navigator.test.ts +0 -1452
  1081. package/tests/unit/teamcity/build-configuration-manager.test.ts +0 -750
  1082. package/tests/unit/teamcity/build-configuration-resolver.test.ts +0 -659
  1083. package/tests/unit/teamcity/build-list-manager.test.ts +0 -574
  1084. package/tests/unit/teamcity/build-parameters-manager.test.ts +0 -712
  1085. package/tests/unit/teamcity/build-progress-tracker.test.ts +0 -1030
  1086. package/tests/unit/teamcity/build-query-builder.test.ts +0 -311
  1087. package/tests/unit/teamcity/build-queue-manager.test.ts +0 -879
  1088. package/tests/unit/teamcity/build-results-manager.test.ts +0 -630
  1089. package/tests/unit/teamcity/build-status-manager.test.ts +0 -640
  1090. package/tests/unit/teamcity/build-step-manager.test.ts +0 -886
  1091. package/tests/unit/teamcity/build-trigger-manager.test.ts +0 -1052
  1092. package/tests/unit/teamcity/configuration-branch-matcher.test.ts +0 -692
  1093. package/tests/unit/teamcity/pagination.test.ts +0 -118
  1094. package/tests/unit/teamcity/project-list-manager.test.ts +0 -118
  1095. package/tests/unit/teamcity/project-manager-branches.test.ts +0 -176
  1096. package/tests/unit/teamcity/project-manager-more.test.ts +0 -90
  1097. package/tests/unit/teamcity/project-manager.test.ts +0 -189
  1098. package/tests/unit/teamcity/project-navigator-branches.test.ts +0 -168
  1099. package/tests/unit/teamcity/project-navigator-more.test.ts +0 -58
  1100. package/tests/unit/teamcity/project-navigator.test.ts +0 -791
  1101. package/tests/unit/teamcity/test-problem-reporter-trend-patterns.test.ts +0 -80
  1102. package/tests/unit/teamcity/test-problem-reporter.test.ts +0 -551
  1103. package/tests/unit/tools/agent-vcs-admin.test.ts +0 -121
  1104. package/tests/unit/tools/availability-and-queue.test.ts +0 -118
  1105. package/tests/unit/tools/branches-vcs-agents.test.ts +0 -119
  1106. package/tests/unit/tools/build-actions-and-status.test.ts +0 -125
  1107. package/tests/unit/tools/bulk-surface-coverage.test.ts +0 -116
  1108. package/tests/unit/tools/compatibility-lookups.test.ts +0 -150
  1109. package/tests/unit/tools/fetch-build-log-ambiguity.test.ts +0 -70
  1110. package/tests/unit/tools/fetch-build-log-by-number.test.ts +0 -66
  1111. package/tests/unit/tools/fetch-build-log-pagination.test.ts +0 -73
  1112. package/tests/unit/tools/fetch-build-log-tail.test.ts +0 -33
  1113. package/tests/unit/tools/get-status-and-results.test.ts +0 -67
  1114. package/tests/unit/tools/list-branches-and-parameters.test.ts +0 -36
  1115. package/tests/unit/tools/list-build-configs-pagination.test.ts +0 -39
  1116. package/tests/unit/tools/list-builds-pagination.test.ts +0 -45
  1117. package/tests/unit/tools/list-pagination-all.test.ts +0 -259
  1118. package/tests/unit/tools/list-projects-pagination.test.ts +0 -39
  1119. package/tests/unit/tools/parameters-and-steps-triggers.test.ts +0 -176
  1120. package/tests/unit/tools/project-build-crud.test.ts +0 -110
  1121. package/tests/unit/tools/project-hierarchy.test.ts +0 -46
  1122. package/tests/unit/tools/queue-maintenance.test.ts +0 -130
  1123. package/tests/unit/tools/server-health-and-metrics.test.ts +0 -134
  1124. package/tests/unit/tools/simple-getters.test.ts +0 -88
  1125. package/tests/unit/tools/update_project_settings.test.ts +0 -64
  1126. package/tests/unit/utils/lru-cache.test.ts +0 -77
  1127. package/tests/unit/utils/mcp.test.ts +0 -82
  1128. package/tests/unit/utils/runTool.test.ts +0 -38
  1129. package/tests/unit/utils/validation.test.ts +0 -168
  1130. package/tsconfig.build.json +0 -28
  1131. package/tsconfig.json +0 -60
  1132. 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
- }