@catchmexz/fedin-vibe-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +202 -0
  2. package/dist/common/errors.js +69 -0
  3. package/dist/common/modularTemplates.js +483 -0
  4. package/dist/common/pipelineTemplates.js +19 -0
  5. package/dist/common/types.js +42 -0
  6. package/dist/common/utils.js +347 -0
  7. package/dist/common/version.js +1 -0
  8. package/dist/index.js +217 -0
  9. package/dist/operations/appstack/appOrchestrations.js +235 -0
  10. package/dist/operations/appstack/appTags.js +147 -0
  11. package/dist/operations/appstack/appTemplates.js +67 -0
  12. package/dist/operations/appstack/applications.js +154 -0
  13. package/dist/operations/appstack/changeOrders.js +293 -0
  14. package/dist/operations/appstack/changeRequests.js +263 -0
  15. package/dist/operations/appstack/deploymentResources.js +265 -0
  16. package/dist/operations/appstack/globalVars.js +200 -0
  17. package/dist/operations/appstack/releaseWorkflows.js +178 -0
  18. package/dist/operations/appstack/variableGroups.js +216 -0
  19. package/dist/operations/codeup/branches.js +144 -0
  20. package/dist/operations/codeup/changeRequestComments.js +89 -0
  21. package/dist/operations/codeup/changeRequests.js +203 -0
  22. package/dist/operations/codeup/compare.js +26 -0
  23. package/dist/operations/codeup/files.js +483 -0
  24. package/dist/operations/codeup/repositories.js +83 -0
  25. package/dist/operations/codeup/types.js +372 -0
  26. package/dist/operations/flow/hostGroup.js +48 -0
  27. package/dist/operations/flow/pipeline.js +530 -0
  28. package/dist/operations/flow/pipelineJob.js +113 -0
  29. package/dist/operations/flow/serviceConnection.js +23 -0
  30. package/dist/operations/flow/types.js +377 -0
  31. package/dist/operations/git/git-repository.js +334 -0
  32. package/dist/operations/git/index.js +210 -0
  33. package/dist/operations/organization/members.js +94 -0
  34. package/dist/operations/organization/organization.js +73 -0
  35. package/dist/operations/organization/types.js +111 -0
  36. package/dist/operations/packages/artifacts.js +64 -0
  37. package/dist/operations/packages/repositories.js +35 -0
  38. package/dist/operations/packages/types.js +56 -0
  39. package/dist/operations/projex/project.js +206 -0
  40. package/dist/operations/projex/sprint.js +90 -0
  41. package/dist/operations/projex/types.js +390 -0
  42. package/dist/operations/projex/workitem.js +452 -0
  43. package/dist/tool-handlers/appstack-change-orders.js +55 -0
  44. package/dist/tool-handlers/appstack-change-requests.js +49 -0
  45. package/dist/tool-handlers/appstack-deployment-resources.js +43 -0
  46. package/dist/tool-handlers/appstack-global-vars.js +43 -0
  47. package/dist/tool-handlers/appstack-orchestrations.js +49 -0
  48. package/dist/tool-handlers/appstack-tags.js +43 -0
  49. package/dist/tool-handlers/appstack-templates.js +19 -0
  50. package/dist/tool-handlers/appstack-variable-groups.js +55 -0
  51. package/dist/tool-handlers/appstack.js +37 -0
  52. package/dist/tool-handlers/code-management.js +174 -0
  53. package/dist/tool-handlers/git/branch-operations.js +1 -0
  54. package/dist/tool-handlers/git/clone-repository.js +36 -0
  55. package/dist/tool-handlers/git/create-branch.js +26 -0
  56. package/dist/tool-handlers/git/get-repository-status.js +33 -0
  57. package/dist/tool-handlers/git/pull-repository.js +27 -0
  58. package/dist/tool-handlers/git/push-repository.js +37 -0
  59. package/dist/tool-handlers/git/switch-branch.js +25 -0
  60. package/dist/tool-handlers/index.js +43 -0
  61. package/dist/tool-handlers/organization.js +90 -0
  62. package/dist/tool-handlers/packages.js +32 -0
  63. package/dist/tool-handlers/pipeline.js +272 -0
  64. package/dist/tool-handlers/project-management.js +152 -0
  65. package/dist/tool-handlers/service-connections.js +16 -0
  66. package/dist/tool-registry/appstack-change-orders.js +40 -0
  67. package/dist/tool-registry/appstack-change-requests.js +35 -0
  68. package/dist/tool-registry/appstack-deployment-resources.js +30 -0
  69. package/dist/tool-registry/appstack-global-vars.js +30 -0
  70. package/dist/tool-registry/appstack-orchestrations.js +35 -0
  71. package/dist/tool-registry/appstack-tags.js +30 -0
  72. package/dist/tool-registry/appstack-templates.js +10 -0
  73. package/dist/tool-registry/appstack-variable-groups.js +40 -0
  74. package/dist/tool-registry/appstack.js +25 -0
  75. package/dist/tool-registry/code-management.js +89 -0
  76. package/dist/tool-registry/git-repository.js +41 -0
  77. package/dist/tool-registry/index.js +6 -0
  78. package/dist/tool-registry/organization.js +65 -0
  79. package/dist/tool-registry/packages.js +21 -0
  80. package/dist/tool-registry/pipeline.js +157 -0
  81. package/dist/tool-registry/project-management.js +108 -0
  82. package/dist/tool-registry/service-connections.js +10 -0
  83. package/package.json +39 -0
@@ -0,0 +1,452 @@
1
+ import { buildUrl, yunxiaoRequest } from "../../common/utils.js";
2
+ import { WorkItemSchema } from "./types.js";
3
+ import { getCurrentUserFunc } from "../organization/organization.js";
4
+ export async function getWorkItemFunc(organizationId, workItemId) {
5
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}`;
6
+ const response = await yunxiaoRequest(url, {
7
+ method: "GET",
8
+ });
9
+ return WorkItemSchema.parse(response);
10
+ }
11
+ export async function searchWorkitemsFunc(organizationId, category, spaceId, subject, status, createdAfter, createdBefore, updatedAfter, updatedBefore, creator, assignedTo, advancedConditions, orderBy = "gmtCreate", includeDetails = false // 新增参数:是否自动补充缺失的description等详细信息
12
+ ) {
13
+ // 处理assignedTo为"self"的情况,自动获取当前用户ID
14
+ let finalAssignedTo = assignedTo;
15
+ let finalCreator = creator;
16
+ if (assignedTo === "self" || creator === "self") {
17
+ try {
18
+ const currentUser = await getCurrentUserFunc();
19
+ if (currentUser.id) {
20
+ if (assignedTo === "self") {
21
+ finalAssignedTo = currentUser.id;
22
+ }
23
+ if (creator === "self") {
24
+ finalCreator = currentUser.id;
25
+ }
26
+ }
27
+ else {
28
+ finalAssignedTo = assignedTo;
29
+ finalCreator = creator;
30
+ }
31
+ }
32
+ catch (error) {
33
+ finalAssignedTo = assignedTo;
34
+ finalCreator = creator;
35
+ }
36
+ }
37
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems:search`;
38
+ const payload = {
39
+ category: category,
40
+ spaceId: spaceId,
41
+ };
42
+ const conditions = buildWorkitemConditions({
43
+ subject,
44
+ status,
45
+ createdAfter,
46
+ createdBefore,
47
+ updatedAfter,
48
+ updatedBefore,
49
+ creator: finalCreator,
50
+ assignedTo: finalAssignedTo,
51
+ advancedConditions
52
+ });
53
+ if (conditions) {
54
+ payload.conditions = conditions;
55
+ }
56
+ payload.orderBy = orderBy;
57
+ const response = await yunxiaoRequest(url, {
58
+ method: "POST",
59
+ body: payload,
60
+ });
61
+ if (!Array.isArray(response)) {
62
+ return [];
63
+ }
64
+ const workItems = response.map(workitem => WorkItemSchema.parse(workitem));
65
+ // 如果需要补充详细信息,使用分批并发方式获取
66
+ if (includeDetails) {
67
+ const itemsNeedingDetails = workItems.filter(item => item.id.length > 0 &&
68
+ (item.description === null || item.description === undefined || item.description === ""));
69
+ if (itemsNeedingDetails.length > 0) {
70
+ // 分批并发获取详情
71
+ const descriptionMap = await batchGetWorkItemDetails(organizationId, itemsNeedingDetails);
72
+ // 更新workItems中的description
73
+ return workItems.map(item => {
74
+ if (descriptionMap.has(item.id)) {
75
+ return {
76
+ ...item,
77
+ description: descriptionMap.get(item.id) || item.description
78
+ };
79
+ }
80
+ return item;
81
+ });
82
+ }
83
+ }
84
+ return workItems;
85
+ }
86
+ // 分批并发获取工作项详情
87
+ async function batchGetWorkItemDetails(organizationId, workItems, batchSize = 10, // 每批处理10个
88
+ maxItems = 100 // 最多处理100个
89
+ ) {
90
+ const descriptionMap = new Map();
91
+ // 限制处理数量
92
+ const limitedItems = workItems.slice(0, maxItems);
93
+ // 分批处理
94
+ for (let i = 0; i < limitedItems.length; i += batchSize) {
95
+ const batch = limitedItems.slice(i, i + batchSize);
96
+ // 批次内并发执行
97
+ const batchResults = await Promise.allSettled(batch.map(async (item) => {
98
+ // 再次检查item.id是否为有效字符串
99
+ if (typeof item.id !== 'string' || item.id.length === 0) {
100
+ return {
101
+ id: item.id || 'unknown',
102
+ description: null,
103
+ success: false
104
+ };
105
+ }
106
+ const itemId = item.id;
107
+ try {
108
+ const detailedItem = await getWorkItemFunc(organizationId, itemId);
109
+ return {
110
+ id: itemId,
111
+ description: detailedItem.description,
112
+ success: true
113
+ };
114
+ }
115
+ catch (error) {
116
+ return {
117
+ id: itemId,
118
+ description: null,
119
+ success: false
120
+ };
121
+ }
122
+ }));
123
+ // 处理批次结果
124
+ batchResults.forEach((result) => {
125
+ if (result.status === 'fulfilled') {
126
+ // 确保description类型正确,将undefined转换为null
127
+ const description = result.value.description === undefined ? null : result.value.description;
128
+ descriptionMap.set(result.value.id, description);
129
+ }
130
+ });
131
+ }
132
+ return descriptionMap;
133
+ }
134
+ function buildWorkitemConditions(args) {
135
+ if (args.advancedConditions) {
136
+ return args.advancedConditions;
137
+ }
138
+ const filterConditions = [];
139
+ if (args.subject) {
140
+ filterConditions.push({
141
+ className: "string",
142
+ fieldIdentifier: "subject",
143
+ format: "input",
144
+ operator: "CONTAINS",
145
+ toValue: null,
146
+ value: [args.subject],
147
+ });
148
+ }
149
+ if (args.status) {
150
+ const statusValues = args.status.split(",");
151
+ const values = statusValues.map(v => v.trim());
152
+ filterConditions.push({
153
+ className: "status",
154
+ fieldIdentifier: "status",
155
+ format: "list",
156
+ operator: "CONTAINS",
157
+ toValue: null,
158
+ value: values,
159
+ });
160
+ }
161
+ if (args.createdAfter) {
162
+ const createdBefore = args.createdBefore ? `${args.createdBefore} 23:59:59` : null;
163
+ filterConditions.push({
164
+ className: "dateTime",
165
+ fieldIdentifier: "gmtCreate",
166
+ format: "input",
167
+ operator: "BETWEEN",
168
+ toValue: createdBefore,
169
+ value: [`${args.createdAfter} 00:00:00`],
170
+ });
171
+ }
172
+ if (args.updatedAfter) {
173
+ const updatedBefore = args.updatedBefore ? `${args.updatedBefore} 23:59:59` : null;
174
+ filterConditions.push({
175
+ className: "dateTime",
176
+ fieldIdentifier: "gmtModified",
177
+ format: "input",
178
+ operator: "BETWEEN",
179
+ toValue: updatedBefore,
180
+ value: [`${args.updatedAfter} 00:00:00`],
181
+ });
182
+ }
183
+ if (args.creator) {
184
+ const creatorValues = args.creator.split(",");
185
+ const values = creatorValues.map(v => v.trim());
186
+ filterConditions.push({
187
+ className: "user",
188
+ fieldIdentifier: "creator",
189
+ format: "list",
190
+ operator: "CONTAINS",
191
+ toValue: null,
192
+ value: values,
193
+ });
194
+ }
195
+ if (args.assignedTo) {
196
+ const assignedToValues = args.assignedTo.split(",");
197
+ const values = assignedToValues.map(v => v.trim());
198
+ filterConditions.push({
199
+ className: "user",
200
+ fieldIdentifier: "assignedTo",
201
+ format: "list",
202
+ operator: "CONTAINS",
203
+ toValue: null,
204
+ value: values,
205
+ });
206
+ }
207
+ if (filterConditions.length === 0) {
208
+ return undefined;
209
+ }
210
+ const conditions = {
211
+ conditionGroups: [filterConditions],
212
+ };
213
+ return JSON.stringify(conditions);
214
+ }
215
+ export async function createWorkItemFunc(organizationId, assignedTo, spaceId, subject, workitemTypeId, customFieldValues, description, labels, parentId, participants, sprint, trackers, verifier, versions) {
216
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems`;
217
+ const payload = {
218
+ assignedTo,
219
+ spaceId,
220
+ subject,
221
+ workitemTypeId
222
+ };
223
+ if (customFieldValues) {
224
+ payload.customFieldValues = customFieldValues;
225
+ }
226
+ if (description !== undefined) {
227
+ payload.description = description;
228
+ }
229
+ if (labels && labels.length > 0) {
230
+ payload.labels = labels;
231
+ }
232
+ if (parentId !== undefined) {
233
+ payload.parentId = parentId;
234
+ }
235
+ if (participants && participants.length > 0) {
236
+ payload.participants = participants;
237
+ }
238
+ if (sprint !== undefined) {
239
+ payload.sprint = sprint;
240
+ }
241
+ if (trackers && trackers.length > 0) {
242
+ payload.trackers = trackers;
243
+ }
244
+ if (verifier !== undefined) {
245
+ payload.verifier = verifier;
246
+ }
247
+ if (versions && versions.length > 0) {
248
+ payload.versions = versions;
249
+ }
250
+ const response = await yunxiaoRequest(url, {
251
+ method: "POST",
252
+ body: payload,
253
+ });
254
+ return WorkItemSchema.parse(response);
255
+ }
256
+ export async function updateWorkItemFunc(organizationId, workItemId, updateWorkItemFields) {
257
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}`;
258
+ const response = await yunxiaoRequest(url, {
259
+ method: "PUT",
260
+ body: updateWorkItemFields,
261
+ });
262
+ }
263
+ export async function getWorkItemTypesFunc(organizationId, id, // 项目唯一标识
264
+ category // 工作项类型,可选值为 Req,Bug,Task 等。
265
+ ) {
266
+ const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${id}/workitemTypes?category=${encodeURIComponent(category)}`;
267
+ const response = await yunxiaoRequest(url, {
268
+ method: "GET",
269
+ });
270
+ return response;
271
+ }
272
+ /**
273
+ * 列出所有工作项类型
274
+ * @param organizationId 企业ID
275
+ * @returns 工作项类型列表
276
+ */
277
+ export async function listAllWorkItemTypesFunc(organizationId) {
278
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes`;
279
+ const response = await yunxiaoRequest(url, {
280
+ method: "GET",
281
+ });
282
+ // 确保返回的是数组格式
283
+ if (Array.isArray(response)) {
284
+ return response;
285
+ }
286
+ // 如果响应中包含result字段,则返回result中的数据
287
+ if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
288
+ return response.result;
289
+ }
290
+ // 其他情况返回空数组
291
+ return [];
292
+ }
293
+ /**
294
+ * 列出工作项类型
295
+ * @param organizationId 企业ID
296
+ * @param spaceIdentifier 项目唯一标识
297
+ * @param category 工作项类型分类(可选)
298
+ * @returns 工作项类型列表
299
+ */
300
+ export async function listWorkItemTypesFunc(organizationId, spaceIdentifier, category) {
301
+ let url = `/oapi/v1/projex/organizations/${organizationId}/projects/${spaceIdentifier}/workitemTypes`;
302
+ // 如果提供了category参数,则添加到URL中
303
+ if (category) {
304
+ url += `?category=${encodeURIComponent(category)}`;
305
+ }
306
+ const response = await yunxiaoRequest(url, {
307
+ method: "GET",
308
+ });
309
+ // 确保返回的是数组格式
310
+ if (Array.isArray(response)) {
311
+ return response;
312
+ }
313
+ // 如果响应中包含result字段,则返回result中的数据
314
+ if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
315
+ return response.result;
316
+ }
317
+ // 其他情况返回空数组
318
+ return [];
319
+ }
320
+ /**
321
+ * 获取工作项类型详情
322
+ * @param organizationId 企业ID
323
+ * @param spaceIdentifier 项目唯一标识
324
+ * @param id 工作项类型ID
325
+ * @returns 工作项类型详情
326
+ */
327
+ export async function getWorkItemTypeFunc(organizationId, id) {
328
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes/${id}`;
329
+ const response = await yunxiaoRequest(url, {
330
+ method: "GET",
331
+ });
332
+ // 如果响应中包含result字段,则返回result中的数据
333
+ if (response && typeof response === 'object' && 'result' in response) {
334
+ return response.result;
335
+ }
336
+ // 否则直接返回响应
337
+ return response;
338
+ }
339
+ /**
340
+ * 列出工作项关联的工作项类型
341
+ * @param organizationId 企业ID
342
+ * @param spaceIdentifier 项目唯一标识
343
+ * @param workItemTypeId 工作项ID
344
+ * @param relationType 关联类型 (BLOCK, RELATE, DUPLICATE, CHILD)
345
+ * @returns 关联的工作项类型列表
346
+ */
347
+ export async function listWorkItemRelationWorkItemTypesFunc(organizationId, workItemTypeId, relationType) {
348
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitemTypes/${workItemTypeId}/relationWorkitemTypes`;
349
+ const queryParams = {};
350
+ if (relationType != null) {
351
+ queryParams.relationType = relationType;
352
+ }
353
+ let finalUrl = buildUrl(url, queryParams);
354
+ const response = await yunxiaoRequest(finalUrl, {
355
+ method: "GET",
356
+ });
357
+ // 确保返回的是数组格式
358
+ if (Array.isArray(response)) {
359
+ return response;
360
+ }
361
+ // 如果响应中包含result字段,则返回result中的数据
362
+ if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
363
+ return response.result;
364
+ }
365
+ // 其他情况返回空数组
366
+ return [];
367
+ }
368
+ /**
369
+ * 获取工作项类型字段配置
370
+ * @param organizationId 企业ID
371
+ * @param projectId 项目唯一标识
372
+ * @param workItemTypeId 工作项类型ID
373
+ * @returns 工作项类型字段配置
374
+ */
375
+ export async function getWorkItemTypeFieldConfigFunc(organizationId, projectId, workItemTypeId) {
376
+ const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${projectId}/workitemTypes/${workItemTypeId}/fields`;
377
+ const response = await yunxiaoRequest(url, {
378
+ method: "GET",
379
+ });
380
+ // 如果响应中包含result字段,则返回result中的数据
381
+ if (response && typeof response === 'object' && 'result' in response) {
382
+ return response.result;
383
+ }
384
+ // 否则直接返回响应
385
+ return response;
386
+ }
387
+ /**
388
+ * 获取工作项工作流
389
+ * @param organizationId 企业ID
390
+ * @param projectId 项目唯一标识
391
+ * @param workItemTypeId 工作项类型ID
392
+ * @returns 工作项工作流信息
393
+ */
394
+ export async function getWorkItemWorkflowFunc(organizationId, projectId, workItemTypeId) {
395
+ const url = `/oapi/v1/projex/organizations/${organizationId}/projects/${projectId}/workitemTypes/${workItemTypeId}/workflows`;
396
+ const response = await yunxiaoRequest(url, {
397
+ method: "GET",
398
+ });
399
+ // 如果响应中包含result字段,则返回result中的数据
400
+ if (response && typeof response === 'object' && 'result' in response) {
401
+ return response.result;
402
+ }
403
+ // 否则直接返回响应
404
+ return response;
405
+ }
406
+ /**
407
+ * 列出工作项评论
408
+ * @param organizationId 企业ID
409
+ * @param workItemId 工作项ID
410
+ * @param page 页码
411
+ * @param perPage 每页条数
412
+ * @returns 工作项评论列表
413
+ */
414
+ export async function listWorkItemCommentsFunc(organizationId, workItemId, page = 1, perPage = 20) {
415
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}/comments?page=${page}&perPage=${perPage}`;
416
+ const response = await yunxiaoRequest(url, {
417
+ method: "GET",
418
+ });
419
+ // 确保返回的是数组格式
420
+ if (Array.isArray(response)) {
421
+ return response;
422
+ }
423
+ // 如果响应中包含result字段,则返回result中的数据
424
+ if (response && typeof response === 'object' && 'result' in response && Array.isArray(response.result)) {
425
+ return response.result;
426
+ }
427
+ // 其他情况返回空数组
428
+ return [];
429
+ }
430
+ /**
431
+ * 创建工作项评论
432
+ * @param organizationId 企业ID
433
+ * @param workItemId 工作项ID
434
+ * @param content 评论内容
435
+ * @returns 创建的评论信息
436
+ */
437
+ export async function createWorkItemCommentFunc(organizationId, workItemId, content) {
438
+ const url = `/oapi/v1/projex/organizations/${organizationId}/workitems/${workItemId}/comments`;
439
+ const payload = {
440
+ content: content
441
+ };
442
+ const response = await yunxiaoRequest(url, {
443
+ method: "POST",
444
+ body: payload,
445
+ });
446
+ // 如果响应中包含result字段,则返回result中的数据
447
+ if (response && typeof response === 'object' && 'result' in response) {
448
+ return response.result;
449
+ }
450
+ // 否则直接返回响应
451
+ return response;
452
+ }
@@ -0,0 +1,55 @@
1
+ import { createChangeOrder, listChangeOrderVersions, getChangeOrder, listChangeOrderJobLogs, findTaskOperationLog, executeJobAction, listChangeOrdersByOrigin, CreateChangeOrderRequestSchema, ListChangeOrderVersionsRequestSchema, GetChangeOrderRequestSchema, ListChangeOrderJobLogsRequestSchema, FindTaskOperationLogRequestSchema, ExecuteJobActionRequestSchema, ListChangeOrdersByOriginRequestSchema } from '../operations/appstack/changeOrders.js';
2
+ /**
3
+ * Handle the appstack change order tool requests
4
+ *
5
+ * @param request - The tool request
6
+ * @returns The tool response or null if not handled
7
+ */
8
+ export async function handleAppStackChangeOrderTools(request) {
9
+ switch (request.params.name) {
10
+ case 'create_change_order':
11
+ const createParams = CreateChangeOrderRequestSchema.parse(request.params.arguments);
12
+ const createResult = await createChangeOrder(createParams);
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
15
+ };
16
+ case 'list_change_order_versions':
17
+ const listVersionsParams = ListChangeOrderVersionsRequestSchema.parse(request.params.arguments);
18
+ const listVersionsResult = await listChangeOrderVersions(listVersionsParams);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(listVersionsResult, null, 2) }],
21
+ };
22
+ case 'get_change_order':
23
+ const getParams = GetChangeOrderRequestSchema.parse(request.params.arguments);
24
+ const getResult = await getChangeOrder(getParams);
25
+ return {
26
+ content: [{ type: "text", text: JSON.stringify(getResult, null, 2) }],
27
+ };
28
+ case 'list_change_order_job_logs':
29
+ const listLogsParams = ListChangeOrderJobLogsRequestSchema.parse(request.params.arguments);
30
+ const listLogsResult = await listChangeOrderJobLogs(listLogsParams);
31
+ return {
32
+ content: [{ type: "text", text: JSON.stringify(listLogsResult, null, 2) }],
33
+ };
34
+ case 'find_task_operation_log':
35
+ const findLogParams = FindTaskOperationLogRequestSchema.parse(request.params.arguments);
36
+ const findLogResult = await findTaskOperationLog(findLogParams);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(findLogResult, null, 2) }],
39
+ };
40
+ case 'execute_job_action':
41
+ const executeParams = ExecuteJobActionRequestSchema.parse(request.params.arguments);
42
+ const executeResult = await executeJobAction(executeParams);
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(executeResult, null, 2) }],
45
+ };
46
+ case 'list_change_orders_by_origin':
47
+ const listByOriginParams = ListChangeOrdersByOriginRequestSchema.parse(request.params.arguments);
48
+ const listByOriginResult = await listChangeOrdersByOrigin(listByOriginParams);
49
+ return {
50
+ content: [{ type: "text", text: JSON.stringify(listByOriginResult, null, 2) }],
51
+ };
52
+ default:
53
+ return null;
54
+ }
55
+ }
@@ -0,0 +1,49 @@
1
+ import { createChangeRequest, getChangeRequestAuditItems, listChangeRequestExecutions, listChangeRequestWorkItems, cancelChangeRequest, closeChangeRequest, CreateChangeRequestRequestSchema, GetChangeRequestAuditItemsRequestSchema, ListChangeRequestExecutionsRequestSchema, ListChangeRequestWorkItemsRequestSchema, CancelChangeRequestRequestSchema, CloseChangeRequestRequestSchema } from '../operations/appstack/changeRequests.js';
2
+ /**
3
+ * Handle the appstack change requests tool requests
4
+ *
5
+ * @param request - The tool request
6
+ * @returns The tool response or null if not handled
7
+ */
8
+ export async function handleAppStackChangeRequestTools(request) {
9
+ switch (request.params.name) {
10
+ case 'create_change_request':
11
+ const createParams = CreateChangeRequestRequestSchema.parse(request.params.arguments);
12
+ const createResult = await createChangeRequest(createParams);
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
15
+ };
16
+ case 'get_change_request_audit_items':
17
+ const getAuditParams = GetChangeRequestAuditItemsRequestSchema.parse(request.params.arguments);
18
+ const getAuditResult = await getChangeRequestAuditItems(getAuditParams);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(getAuditResult, null, 2) }],
21
+ };
22
+ case 'list_change_request_executions':
23
+ const listExecParams = ListChangeRequestExecutionsRequestSchema.parse(request.params.arguments);
24
+ const listExecResult = await listChangeRequestExecutions(listExecParams);
25
+ return {
26
+ content: [{ type: "text", text: JSON.stringify(listExecResult, null, 2) }],
27
+ };
28
+ case 'list_change_request_work_items':
29
+ const listWorkParams = ListChangeRequestWorkItemsRequestSchema.parse(request.params.arguments);
30
+ const listWorkResult = await listChangeRequestWorkItems(listWorkParams);
31
+ return {
32
+ content: [{ type: "text", text: JSON.stringify(listWorkResult, null, 2) }],
33
+ };
34
+ case 'cancel_change_request':
35
+ const cancelParams = CancelChangeRequestRequestSchema.parse(request.params.arguments);
36
+ const cancelResult = await cancelChangeRequest(cancelParams);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(cancelResult, null, 2) }],
39
+ };
40
+ case 'close_change_request':
41
+ const closeParams = CloseChangeRequestRequestSchema.parse(request.params.arguments);
42
+ const closeResult = await closeChangeRequest(closeParams);
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(closeResult, null, 2) }],
45
+ };
46
+ default:
47
+ return null;
48
+ }
49
+ }
@@ -0,0 +1,43 @@
1
+ import { getMachineDeployLog, addHostListToHostGroup, addHostListToDeployGroup, deleteHostListFromDeployGroup, deleteHostListFromHostGroup, GetMachineDeployLogRequestSchema, AddHostListToHostGroupRequestSchema, AddHostListToDeployGroupRequestSchema, DeleteHostListFromDeployGroupRequestSchema, DeleteHostListFromHostGroupRequestSchema } from '../operations/appstack/deploymentResources.js';
2
+ /**
3
+ * Handle the appstack deployment resources tool requests
4
+ *
5
+ * @param request - The tool request
6
+ * @returns The tool response or null if not handled
7
+ */
8
+ export async function handleAppStackDeploymentResourceTools(request) {
9
+ switch (request.params.name) {
10
+ case 'get_machine_deploy_log':
11
+ const getLogParams = GetMachineDeployLogRequestSchema.parse(request.params.arguments);
12
+ const getLogResult = await getMachineDeployLog(getLogParams);
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(getLogResult, null, 2) }],
15
+ };
16
+ case 'add_host_list_to_host_group':
17
+ const addHostGroupParams = AddHostListToHostGroupRequestSchema.parse(request.params.arguments);
18
+ const addHostGroupResult = await addHostListToHostGroup(addHostGroupParams);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(addHostGroupResult, null, 2) }],
21
+ };
22
+ case 'add_host_list_to_deploy_group':
23
+ const addDeployGroupParams = AddHostListToDeployGroupRequestSchema.parse(request.params.arguments);
24
+ const addDeployGroupResult = await addHostListToDeployGroup(addDeployGroupParams);
25
+ return {
26
+ content: [{ type: "text", text: JSON.stringify(addDeployGroupResult, null, 2) }],
27
+ };
28
+ case 'delete_host_list_from_deploy_group':
29
+ const deleteDeployGroupParams = DeleteHostListFromDeployGroupRequestSchema.parse(request.params.arguments);
30
+ const deleteDeployGroupResult = await deleteHostListFromDeployGroup(deleteDeployGroupParams);
31
+ return {
32
+ content: [{ type: "text", text: JSON.stringify(deleteDeployGroupResult, null, 2) }],
33
+ };
34
+ case 'delete_host_list_from_host_group':
35
+ const deleteHostGroupParams = DeleteHostListFromHostGroupRequestSchema.parse(request.params.arguments);
36
+ const deleteHostGroupResult = await deleteHostListFromHostGroup(deleteHostGroupParams);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(deleteHostGroupResult, null, 2) }],
39
+ };
40
+ default:
41
+ return null;
42
+ }
43
+ }
@@ -0,0 +1,43 @@
1
+ import { createGlobalVar, deleteGlobalVar, getGlobalVar, updateGlobalVar, listGlobalVars, CreateGlobalVarRequestSchema, DeleteGlobalVarRequestSchema, GetGlobalVarRequestSchema, UpdateGlobalVarRequestSchema, ListGlobalVarsRequestSchema } from '../operations/appstack/globalVars.js';
2
+ /**
3
+ * Handle the appstack global variables tool requests
4
+ *
5
+ * @param request - The tool request
6
+ * @returns The tool response or null if not handled
7
+ */
8
+ export async function handleAppStackGlobalVarTools(request) {
9
+ switch (request.params.name) {
10
+ case 'create_global_var':
11
+ const createParams = CreateGlobalVarRequestSchema.parse(request.params.arguments);
12
+ const createResult = await createGlobalVar(createParams);
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(createResult, null, 2) }],
15
+ };
16
+ case 'delete_global_var':
17
+ const deleteParams = DeleteGlobalVarRequestSchema.parse(request.params.arguments);
18
+ const deleteResult = await deleteGlobalVar(deleteParams);
19
+ return {
20
+ content: [{ type: "text", text: JSON.stringify(deleteResult, null, 2) }],
21
+ };
22
+ case 'get_global_var':
23
+ const getParams = GetGlobalVarRequestSchema.parse(request.params.arguments);
24
+ const getResult = await getGlobalVar(getParams);
25
+ return {
26
+ content: [{ type: "text", text: JSON.stringify(getResult, null, 2) }],
27
+ };
28
+ case 'update_global_var':
29
+ const updateParams = UpdateGlobalVarRequestSchema.parse(request.params.arguments);
30
+ const updateResult = await updateGlobalVar(updateParams);
31
+ return {
32
+ content: [{ type: "text", text: JSON.stringify(updateResult, null, 2) }],
33
+ };
34
+ case 'list_global_vars':
35
+ const listParams = ListGlobalVarsRequestSchema.parse(request.params.arguments);
36
+ const listResult = await listGlobalVars(listParams);
37
+ return {
38
+ content: [{ type: "text", text: JSON.stringify(listResult, null, 2) }],
39
+ };
40
+ default:
41
+ return null;
42
+ }
43
+ }