devops-mcp-server-extension 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +218 -0
- package/README.md +527 -0
- package/README.zh-cn.md +503 -0
- package/dist/common/errors.js +77 -0
- package/dist/common/modularTemplates.js +483 -0
- package/dist/common/pipelineTemplates.js +19 -0
- package/dist/common/toolsetManager.js +123 -0
- package/dist/common/toolsets.js +23 -0
- package/dist/common/types.js +60 -0
- package/dist/common/utils.js +381 -0
- package/dist/common/version.js +1 -0
- package/dist/index.js +225 -0
- package/dist/operations/appstack/appOrchestrations.js +260 -0
- package/dist/operations/appstack/appTags.js +168 -0
- package/dist/operations/appstack/appTemplates.js +72 -0
- package/dist/operations/appstack/applications.js +171 -0
- package/dist/operations/appstack/changeOrders.js +320 -0
- package/dist/operations/appstack/changeRequests.js +288 -0
- package/dist/operations/appstack/deploymentResources.js +286 -0
- package/dist/operations/appstack/globalVars.js +221 -0
- package/dist/operations/appstack/releaseWorkflows.js +695 -0
- package/dist/operations/appstack/variableGroups.js +245 -0
- package/dist/operations/codeup/branches.js +157 -0
- package/dist/operations/codeup/changeRequestComments.js +140 -0
- package/dist/operations/codeup/changeRequests.js +230 -0
- package/dist/operations/codeup/commits.js +121 -0
- package/dist/operations/codeup/compare.js +30 -0
- package/dist/operations/codeup/files.js +249 -0
- package/dist/operations/codeup/repositories.js +71 -0
- package/dist/operations/codeup/types.js +414 -0
- package/dist/operations/flow/hostGroup.js +52 -0
- package/dist/operations/flow/pipeline.js +609 -0
- package/dist/operations/flow/pipelineJob.js +126 -0
- package/dist/operations/flow/resourceMember.js +137 -0
- package/dist/operations/flow/serviceConnection.js +27 -0
- package/dist/operations/flow/tag.js +191 -0
- package/dist/operations/flow/types.js +523 -0
- package/dist/operations/flow/vmDeployOrder.js +171 -0
- package/dist/operations/organization/members.js +106 -0
- package/dist/operations/organization/organization.js +110 -0
- package/dist/operations/organization/types.js +111 -0
- package/dist/operations/packages/artifacts.js +71 -0
- package/dist/operations/packages/repositories.js +39 -0
- package/dist/operations/packages/types.js +56 -0
- package/dist/operations/projex/effort.js +122 -0
- package/dist/operations/projex/project.js +243 -0
- package/dist/operations/projex/sprint.js +103 -0
- package/dist/operations/projex/types.js +618 -0
- package/dist/operations/projex/workitem.js +826 -0
- package/dist/operations/testhub/testcases.js +240 -0
- package/dist/operations/testhub/testplans.js +128 -0
- package/dist/tool-handlers/appstack-app-release-workflows.js +103 -0
- package/dist/tool-handlers/appstack-change-orders.js +55 -0
- package/dist/tool-handlers/appstack-change-requests.js +49 -0
- package/dist/tool-handlers/appstack-deployment-resources.js +31 -0
- package/dist/tool-handlers/appstack-global-vars.js +37 -0
- package/dist/tool-handlers/appstack-orchestrations.js +49 -0
- package/dist/tool-handlers/appstack-release-workflows.js +37 -0
- package/dist/tool-handlers/appstack-tags.js +37 -0
- package/dist/tool-handlers/appstack-templates.js +19 -0
- package/dist/tool-handlers/appstack-variable-groups.js +55 -0
- package/dist/tool-handlers/appstack.js +37 -0
- package/dist/tool-handlers/base.js +25 -0
- package/dist/tool-handlers/code-management.js +150 -0
- package/dist/tool-handlers/commit.js +31 -0
- package/dist/tool-handlers/effort.js +103 -0
- package/dist/tool-handlers/index.js +119 -0
- package/dist/tool-handlers/organization.js +72 -0
- package/dist/tool-handlers/packages.js +32 -0
- package/dist/tool-handlers/pipeline.js +289 -0
- package/dist/tool-handlers/project-management.js +201 -0
- package/dist/tool-handlers/resourceMember.js +43 -0
- package/dist/tool-handlers/service-connections.js +16 -0
- package/dist/tool-handlers/tag.js +64 -0
- package/dist/tool-handlers/test-management.js +74 -0
- package/dist/tool-handlers/vmDeployOrder.js +50 -0
- package/dist/tool-registry/appstack-app-release-workflows.js +80 -0
- package/dist/tool-registry/appstack-change-orders.js +40 -0
- package/dist/tool-registry/appstack-change-requests.js +35 -0
- package/dist/tool-registry/appstack-deployment-resources.js +20 -0
- package/dist/tool-registry/appstack-global-vars.js +25 -0
- package/dist/tool-registry/appstack-orchestrations.js +35 -0
- package/dist/tool-registry/appstack-release-workflows.js +25 -0
- package/dist/tool-registry/appstack-tags.js +25 -0
- package/dist/tool-registry/appstack-templates.js +10 -0
- package/dist/tool-registry/appstack-variable-groups.js +40 -0
- package/dist/tool-registry/appstack.js +25 -0
- package/dist/tool-registry/base.js +19 -0
- package/dist/tool-registry/code-management.js +109 -0
- package/dist/tool-registry/commit.js +20 -0
- package/dist/tool-registry/effort.js +39 -0
- package/dist/tool-registry/index.js +7 -0
- package/dist/tool-registry/organization.js +65 -0
- package/dist/tool-registry/packages.js +21 -0
- package/dist/tool-registry/pipeline.js +190 -0
- package/dist/tool-registry/project-management.js +143 -0
- package/dist/tool-registry/resourceMember.js +29 -0
- package/dist/tool-registry/service-connections.js +10 -0
- package/dist/tool-registry/tag.js +44 -0
- package/dist/tool-registry/test-management.js +59 -0
- package/dist/tool-registry/vmDeployOrder.js +34 -0
- package/package.json +52 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { yunxiaoRequest, buildUrl, isRegionEdition } from '../../common/utils.js';
|
|
3
|
+
import { resolveOrganizationId } from '../organization/organization.js';
|
|
4
|
+
// Define the referenced schemas based on their usage
|
|
5
|
+
// Since we can't find the full definitions, we'll create simplified versions
|
|
6
|
+
const AppSchema = z.object({
|
|
7
|
+
name: z.string().optional().describe("应用名称"),
|
|
8
|
+
}).describe("应用");
|
|
9
|
+
const OrchestrationRevisionSchema = z.object({
|
|
10
|
+
author: z.string().nullable().optional().describe("作者"),
|
|
11
|
+
commitTime: z.union([z.number(), z.string()]).nullable().optional().describe("提交时间 (毫秒时间戳或ISO字符串)"),
|
|
12
|
+
message: z.string().nullable().optional().describe("提交信息"),
|
|
13
|
+
sha: z.string().nullable().optional().describe("提交SHA"),
|
|
14
|
+
}).describe("编排版本");
|
|
15
|
+
const AppOrchestrationSchema = z.object({
|
|
16
|
+
app: AppSchema.optional().describe("应用"),
|
|
17
|
+
creatorId: z.string().nullable().optional().describe("创建人ID"),
|
|
18
|
+
description: z.string().nullable().optional().describe("描述"),
|
|
19
|
+
format: z.enum(["MANIFEST", "HELM_CHARTS"]).nullable().optional().describe("格式"),
|
|
20
|
+
gmtCreate: z.string().nullable().optional().describe("创建时间"),
|
|
21
|
+
gmtModified: z.string().nullable().optional().describe("修改时间"),
|
|
22
|
+
modifierId: z.string().nullable().optional().describe("修改人ID"),
|
|
23
|
+
name: z.string().nullable().optional().describe("名称"),
|
|
24
|
+
revision: OrchestrationRevisionSchema.nullable().optional().describe("版本"),
|
|
25
|
+
sn: z.string().nullable().optional().describe("序列号"),
|
|
26
|
+
storageType: z.enum(["BUILTIN", "EXTERNAL"]).nullable().optional().describe("存储类型"),
|
|
27
|
+
suitableResourceTypes: z.array(z.enum(["KUBERNETES", "HOST", "BePending"])).nullable().optional().describe("适用资源类型"),
|
|
28
|
+
type: z.string().nullable().optional().describe("类型"),
|
|
29
|
+
}).describe("应用编排");
|
|
30
|
+
const AppBuiltInOrchestrationSchema = AppOrchestrationSchema.extend({
|
|
31
|
+
componentList: z.array(z.object({}).passthrough()).nullable().optional().describe("组件列表"),
|
|
32
|
+
groupNameMap: z.record(z.string()).nullable().optional().describe("组名映射"),
|
|
33
|
+
labelList: z.array(z.object({}).passthrough()).nullable().optional().describe("标签列表"),
|
|
34
|
+
labelPolicy: z.string().nullable().optional().describe("标签策略"),
|
|
35
|
+
placeholderList: z.array(z.object({}).passthrough()).nullable().optional().describe("占位符列表"),
|
|
36
|
+
syncSourceTemplate: z.object({}).passthrough().nullable().optional().describe("同步源模板"),
|
|
37
|
+
}).describe("应用内置编排");
|
|
38
|
+
const AppExternalCodeupOrchestrationSchema = AppOrchestrationSchema.extend({
|
|
39
|
+
datasource: z.object({}).passthrough().optional().describe("Codeup数据源"),
|
|
40
|
+
}).describe("外置Codeup应用编排");
|
|
41
|
+
const AppExternalGitlabOrchestrationSchema = AppOrchestrationSchema.extend({
|
|
42
|
+
datasource: z.object({}).passthrough().optional().describe("Gitlab数据源"),
|
|
43
|
+
}).describe("外置GitLab应用编排");
|
|
44
|
+
// Schema for the GetLatestOrchestration API
|
|
45
|
+
export const GetLatestOrchestrationRequestSchema = z.object({
|
|
46
|
+
organizationId: z.string().describe("组织ID"),
|
|
47
|
+
appName: z.string().describe("应用名"),
|
|
48
|
+
envName: z.string().describe("环境名"),
|
|
49
|
+
});
|
|
50
|
+
export const GetLatestOrchestrationResponseSchema = z.union([
|
|
51
|
+
AppBuiltInOrchestrationSchema,
|
|
52
|
+
AppExternalCodeupOrchestrationSchema,
|
|
53
|
+
AppExternalGitlabOrchestrationSchema
|
|
54
|
+
]);
|
|
55
|
+
// Schema for the ListAppOrchestration API
|
|
56
|
+
export const ListAppOrchestrationRequestSchema = z.object({
|
|
57
|
+
organizationId: z.string().describe("组织ID"),
|
|
58
|
+
appName: z.string().describe("应用名"),
|
|
59
|
+
});
|
|
60
|
+
export const ListAppOrchestrationResponseSchema = z.object({
|
|
61
|
+
current: z.number().describe("当前页数"),
|
|
62
|
+
pageSize: z.number().describe("每页大小"),
|
|
63
|
+
pages: z.number().describe("总页数"),
|
|
64
|
+
records: z.array(z.union([
|
|
65
|
+
AppBuiltInOrchestrationSchema,
|
|
66
|
+
AppExternalCodeupOrchestrationSchema,
|
|
67
|
+
AppExternalGitlabOrchestrationSchema
|
|
68
|
+
])).describe("数据列表"),
|
|
69
|
+
total: z.number().describe("总数"),
|
|
70
|
+
});
|
|
71
|
+
// Schema for the CreateAppOrchestration API
|
|
72
|
+
export const CreateAppOrchestrationRequestSchema = z.object({
|
|
73
|
+
organizationId: z.string().describe("组织ID"),
|
|
74
|
+
appName: z.string().describe("应用名"),
|
|
75
|
+
templateId: z.string().describe("编排模板 ID"),
|
|
76
|
+
templateType: z.enum(["PREDEFINED", "ORG"]).describe("编排模板类型"),
|
|
77
|
+
});
|
|
78
|
+
export const CreateAppOrchestrationResponseSchema = z.union([
|
|
79
|
+
AppBuiltInOrchestrationSchema,
|
|
80
|
+
AppExternalCodeupOrchestrationSchema,
|
|
81
|
+
AppExternalGitlabOrchestrationSchema
|
|
82
|
+
]);
|
|
83
|
+
// Schema for the DeleteAppOrchestration API
|
|
84
|
+
export const DeleteAppOrchestrationRequestSchema = z.object({
|
|
85
|
+
organizationId: z.string().describe("组织ID"),
|
|
86
|
+
appName: z.string().describe("应用名"),
|
|
87
|
+
sn: z.string().describe("应用编排唯一序列号"),
|
|
88
|
+
});
|
|
89
|
+
export const DeleteAppOrchestrationResponseSchema = z.boolean().describe("调用是否成功");
|
|
90
|
+
// Schema for the GetAppOrchestration API
|
|
91
|
+
export const GetAppOrchestrationRequestSchema = z.object({
|
|
92
|
+
organizationId: z.string().describe("组织ID"),
|
|
93
|
+
appName: z.string().describe("应用名"),
|
|
94
|
+
sn: z.string().describe("应用编排唯一序列号,未指定 tag 和 sha 时将查找最新版本"),
|
|
95
|
+
tagName: z.string().optional().describe("编排 tag"),
|
|
96
|
+
sha: z.string().optional().describe("编排 commit sha"),
|
|
97
|
+
});
|
|
98
|
+
export const GetAppOrchestrationResponseSchema = z.union([
|
|
99
|
+
AppBuiltInOrchestrationSchema,
|
|
100
|
+
AppExternalCodeupOrchestrationSchema,
|
|
101
|
+
AppExternalGitlabOrchestrationSchema
|
|
102
|
+
]);
|
|
103
|
+
// Schema for the UpdateAppOrchestration API
|
|
104
|
+
export const UpdateAppOrchestrationRequestSchema = z.object({
|
|
105
|
+
organizationId: z.string().describe("组织ID"),
|
|
106
|
+
appName: z.string().describe("应用名"),
|
|
107
|
+
sn: z.string().describe("应用编排唯一序列号"),
|
|
108
|
+
branchName: z.enum(["master"]).optional().describe("本次提交的编排分支,不填写则使用默认主干"),
|
|
109
|
+
commitMessage: z.string().optional().describe("本次提交的描述信息"),
|
|
110
|
+
description: z.string().optional().describe("编排描述"),
|
|
111
|
+
fromRevisionSha: z.string().optional().describe("本次提交的基线版本 SHA 值"),
|
|
112
|
+
name: z.string().describe("编排名"),
|
|
113
|
+
spec: z.object({}).passthrough().optional().describe("编排规范"),
|
|
114
|
+
});
|
|
115
|
+
export const UpdateAppOrchestrationResponseSchema = z.union([
|
|
116
|
+
AppBuiltInOrchestrationSchema,
|
|
117
|
+
AppExternalCodeupOrchestrationSchema,
|
|
118
|
+
AppExternalGitlabOrchestrationSchema
|
|
119
|
+
]);
|
|
120
|
+
/**
|
|
121
|
+
* Get the latest orchestration for an environment
|
|
122
|
+
*
|
|
123
|
+
* @param params - The request parameters
|
|
124
|
+
* @returns The latest orchestration
|
|
125
|
+
*/
|
|
126
|
+
export async function getLatestOrchestration(params) {
|
|
127
|
+
const { organizationId, appName, envName } = params;
|
|
128
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
129
|
+
try {
|
|
130
|
+
const url = isRegionEdition()
|
|
131
|
+
? `/oapi/v1/appstack/apps/${appName}/envs/${envName}/orchestration:latestAvailable`
|
|
132
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/envs/${envName}/orchestration:latestAvailable`;
|
|
133
|
+
const response = await yunxiaoRequest(url, {
|
|
134
|
+
method: 'GET',
|
|
135
|
+
});
|
|
136
|
+
return GetLatestOrchestrationResponseSchema.parse(response);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* List application orchestrations
|
|
144
|
+
*
|
|
145
|
+
* @param params - The request parameters
|
|
146
|
+
* @returns The list of application orchestrations
|
|
147
|
+
*/
|
|
148
|
+
export async function listAppOrchestration(params) {
|
|
149
|
+
const { organizationId, appName } = params;
|
|
150
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
151
|
+
try {
|
|
152
|
+
const url = isRegionEdition()
|
|
153
|
+
? `/oapi/v1/appstack/apps/${appName}/orchestrations`
|
|
154
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/orchestrations`;
|
|
155
|
+
const response = await yunxiaoRequest(url, {
|
|
156
|
+
method: 'GET',
|
|
157
|
+
});
|
|
158
|
+
return ListAppOrchestrationResponseSchema.parse(response);
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Create an application orchestration
|
|
166
|
+
*
|
|
167
|
+
* @param params - The request parameters
|
|
168
|
+
* @returns The created application orchestration
|
|
169
|
+
*/
|
|
170
|
+
export async function createAppOrchestration(params) {
|
|
171
|
+
const { organizationId, appName, ...body } = params;
|
|
172
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
173
|
+
try {
|
|
174
|
+
const url = isRegionEdition()
|
|
175
|
+
? `/oapi/v1/appstack/apps/${appName}/orchestrations`
|
|
176
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/orchestrations`;
|
|
177
|
+
const response = await yunxiaoRequest(url, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
body: body,
|
|
180
|
+
});
|
|
181
|
+
return CreateAppOrchestrationResponseSchema.parse(response);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
throw error;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Delete an application orchestration
|
|
189
|
+
*
|
|
190
|
+
* @param params - The request parameters
|
|
191
|
+
* @returns Whether the deletion was successful
|
|
192
|
+
*/
|
|
193
|
+
export async function deleteAppOrchestration(params) {
|
|
194
|
+
const { organizationId, appName, sn } = params;
|
|
195
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
196
|
+
try {
|
|
197
|
+
const url = isRegionEdition()
|
|
198
|
+
? `/oapi/v1/appstack/apps/${appName}/orchestrations/${sn}`
|
|
199
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/orchestrations/${sn}`;
|
|
200
|
+
const response = await yunxiaoRequest(url, {
|
|
201
|
+
method: 'DELETE',
|
|
202
|
+
});
|
|
203
|
+
return DeleteAppOrchestrationResponseSchema.parse(response);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get an application orchestration
|
|
211
|
+
*
|
|
212
|
+
* @param params - The request parameters
|
|
213
|
+
* @returns The application orchestration
|
|
214
|
+
*/
|
|
215
|
+
export async function getAppOrchestration(params) {
|
|
216
|
+
const { organizationId, appName, sn, tagName, sha } = params;
|
|
217
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
218
|
+
// Build query string properly
|
|
219
|
+
const query = {};
|
|
220
|
+
if (tagName)
|
|
221
|
+
query.tagName = tagName;
|
|
222
|
+
if (sha)
|
|
223
|
+
query.sha = sha;
|
|
224
|
+
try {
|
|
225
|
+
const baseUrl = isRegionEdition()
|
|
226
|
+
? `/oapi/v1/appstack/apps/${appName}/orchestrations/${sn}`
|
|
227
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/orchestrations/${sn}`;
|
|
228
|
+
const url = buildUrl(baseUrl, query);
|
|
229
|
+
const response = await yunxiaoRequest(url, {
|
|
230
|
+
method: 'GET',
|
|
231
|
+
});
|
|
232
|
+
return GetAppOrchestrationResponseSchema.parse(response);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
throw error;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Update an application orchestration
|
|
240
|
+
*
|
|
241
|
+
* @param params - The request parameters
|
|
242
|
+
* @returns The updated application orchestration
|
|
243
|
+
*/
|
|
244
|
+
export async function updateAppOrchestration(params) {
|
|
245
|
+
const { organizationId, appName, sn, ...body } = params;
|
|
246
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
247
|
+
try {
|
|
248
|
+
const url = isRegionEdition()
|
|
249
|
+
? `/oapi/v1/appstack/apps/${appName}/orchestrations/${sn}`
|
|
250
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/orchestrations/${sn}`;
|
|
251
|
+
const response = await yunxiaoRequest(url, {
|
|
252
|
+
method: 'PUT',
|
|
253
|
+
body: body,
|
|
254
|
+
});
|
|
255
|
+
return UpdateAppOrchestrationResponseSchema.parse(response);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
throw error;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { yunxiaoRequest, buildUrl, isRegionEdition } from '../../common/utils.js';
|
|
3
|
+
import { resolveOrganizationId } from '../organization/organization.js';
|
|
4
|
+
// Schema for the CreateAppTag API
|
|
5
|
+
export const CreateAppTagRequestSchema = z.object({
|
|
6
|
+
organizationId: z.string().describe("组织ID"),
|
|
7
|
+
name: z.string().describe("应用标签名称"),
|
|
8
|
+
color: z.string().describe("标签颜色:#66acab 蓝绿色, #7b9ab4 蓝灰色, #698cd4 明亮的蓝色, #4676e5 强烈的蓝色, #5c68c1 深蓝紫色, #9f76dA 紫色, #6bAe3f 绿色, #ae9e6b 土黄色, #a7bc60 浅绿, #ae785e 棕色, #eb933e 橙色, #d75644 红色"),
|
|
9
|
+
});
|
|
10
|
+
export const CreateAppTagResponseSchema = z.object({
|
|
11
|
+
frontendStyle: z.string().describe("样式,目前仅含颜色"),
|
|
12
|
+
name: z.string().describe("应用标签名称"),
|
|
13
|
+
});
|
|
14
|
+
// Schema for the UpdateAppTag API
|
|
15
|
+
export const UpdateAppTagRequestSchema = z.object({
|
|
16
|
+
organizationId: z.string().describe("组织ID"),
|
|
17
|
+
name: z.string().describe("应用标签名称"),
|
|
18
|
+
newName: z.string().describe("要修改为的新的应用标签名称,如无需修改,请确保与原name相同"),
|
|
19
|
+
color: z.string().optional().describe("应用标签颜色:#66acab 蓝绿色, #7b9ab4 蓝灰色, #698cd4 明亮的蓝色, #4676e5 强烈的蓝色, #5c68c1 深蓝紫色, #9f76dA 紫色, #6bAe3f 绿色, #ae9e6b 土黄色, #a7bc60 浅绿, #ae785e 棕色, #eb933e 橙色, #d75644 红色。若不填写则保持原有颜色不变"),
|
|
20
|
+
});
|
|
21
|
+
export const UpdateAppTagResponseSchema = z.object({
|
|
22
|
+
frontendStyle: z.string().describe("样式,目前仅含颜色"),
|
|
23
|
+
name: z.string().describe("应用标签名称"),
|
|
24
|
+
});
|
|
25
|
+
// Schema for the DeleteAppTag API
|
|
26
|
+
export const DeleteAppTagRequestSchema = z.object({
|
|
27
|
+
organizationId: z.string().describe("组织ID"),
|
|
28
|
+
name: z.string().describe("应用标签名称"),
|
|
29
|
+
});
|
|
30
|
+
// Schema for the SearchAppTag API
|
|
31
|
+
export const SearchAppTagRequestSchema = z.object({
|
|
32
|
+
organizationId: z.string().describe("组织ID"),
|
|
33
|
+
current: z.number().optional().describe("页数,从1开始。默认值为1"),
|
|
34
|
+
pageSize: z.number().optional().describe("本页返回的数量,默认值为10"),
|
|
35
|
+
orderBy: z.string().optional().describe("排序方式,支持tagName和id,默认为id"),
|
|
36
|
+
sort: z.string().optional().describe("排序方式,支持asc和desc,默认为desc"),
|
|
37
|
+
search: z.string().optional().describe("应用标签名称的模糊搜索"),
|
|
38
|
+
});
|
|
39
|
+
export const SearchAppTagResponseSchema = z.object({
|
|
40
|
+
total: z.number().describe("当前搜索条件下的总数"),
|
|
41
|
+
data: z.array(z.object({
|
|
42
|
+
frontendStyle: z.string().optional().describe("样式,目前仅含颜色"),
|
|
43
|
+
name: z.string().optional().describe("应用标签名称"),
|
|
44
|
+
})).describe("返回的应用标签列表"),
|
|
45
|
+
});
|
|
46
|
+
// Schema for the UpdateAppTagBind API
|
|
47
|
+
export const UpdateAppTagBindRequestSchema = z.object({
|
|
48
|
+
organizationId: z.string().describe("组织ID"),
|
|
49
|
+
appName: z.string().describe("应用名"),
|
|
50
|
+
tagNames: z.array(z.string()).describe("要绑定的应用标签名称列表。注意:tagNames中不存在的应用标签将被忽略。如果tagNames中的所有应用标签都不存在,或者tagNames为空数组,则会清空当前应用的应用标签列表"),
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Create an application tag
|
|
54
|
+
*
|
|
55
|
+
* @param params - The request parameters
|
|
56
|
+
* @returns The created tag details
|
|
57
|
+
*/
|
|
58
|
+
export async function createAppTag(params) {
|
|
59
|
+
const { organizationId, ...body } = params;
|
|
60
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
61
|
+
try {
|
|
62
|
+
const url = isRegionEdition()
|
|
63
|
+
? `/oapi/v1/appstack/appTags`
|
|
64
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/appTags`;
|
|
65
|
+
const response = await yunxiaoRequest(url, {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
body: body,
|
|
68
|
+
});
|
|
69
|
+
return CreateAppTagResponseSchema.parse(response);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Update an application tag
|
|
77
|
+
*
|
|
78
|
+
* @param params - The request parameters
|
|
79
|
+
* @returns The updated tag details
|
|
80
|
+
*/
|
|
81
|
+
export async function updateAppTag(params) {
|
|
82
|
+
const { organizationId, name, ...body } = params;
|
|
83
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
84
|
+
try {
|
|
85
|
+
const url = isRegionEdition()
|
|
86
|
+
? `/oapi/v1/appstack/appTags/updateTag?name=${name}`
|
|
87
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/appTags/updateTag?name=${name}`;
|
|
88
|
+
const response = await yunxiaoRequest(url, {
|
|
89
|
+
method: 'PUT',
|
|
90
|
+
body: body,
|
|
91
|
+
});
|
|
92
|
+
return UpdateAppTagResponseSchema.parse(response);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Delete an application tag
|
|
100
|
+
*
|
|
101
|
+
* @param params - The request parameters
|
|
102
|
+
*/
|
|
103
|
+
export async function deleteAppTag(params) {
|
|
104
|
+
const { organizationId, name } = params;
|
|
105
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
106
|
+
try {
|
|
107
|
+
const url = isRegionEdition()
|
|
108
|
+
? `/oapi/v1/appstack/appTags/deleteTag?name=${name}`
|
|
109
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/appTags/deleteTag?name=${name}`;
|
|
110
|
+
await yunxiaoRequest(url, {
|
|
111
|
+
method: 'DELETE',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Search application tags
|
|
120
|
+
*
|
|
121
|
+
* @param params - The request parameters
|
|
122
|
+
* @returns The search results
|
|
123
|
+
*/
|
|
124
|
+
export async function searchAppTag(params) {
|
|
125
|
+
const { organizationId, current, pageSize, ...body } = params;
|
|
126
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
127
|
+
// Build query string properly
|
|
128
|
+
const query = {};
|
|
129
|
+
if (current)
|
|
130
|
+
query.current = current;
|
|
131
|
+
if (pageSize)
|
|
132
|
+
query.pageSize = pageSize;
|
|
133
|
+
try {
|
|
134
|
+
const baseUrl = isRegionEdition()
|
|
135
|
+
? `/oapi/v1/appstack/appTags:search`
|
|
136
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/appTags:search`;
|
|
137
|
+
const url = buildUrl(baseUrl, query);
|
|
138
|
+
const response = await yunxiaoRequest(url, {
|
|
139
|
+
method: 'POST',
|
|
140
|
+
body: body,
|
|
141
|
+
});
|
|
142
|
+
return SearchAppTagResponseSchema.parse(response);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Update application tag bindings
|
|
150
|
+
*
|
|
151
|
+
* @param params - The request parameters
|
|
152
|
+
*/
|
|
153
|
+
export async function updateAppTagBind(params) {
|
|
154
|
+
const { organizationId, appName, ...body } = params;
|
|
155
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
156
|
+
try {
|
|
157
|
+
const url = isRegionEdition()
|
|
158
|
+
? `/oapi/v1/appstack/apps/${appName}/appTags`
|
|
159
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}/appTags`;
|
|
160
|
+
await yunxiaoRequest(url, {
|
|
161
|
+
method: 'PUT',
|
|
162
|
+
body: body,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { yunxiaoRequest, buildUrl, isRegionEdition } from '../../common/utils.js';
|
|
3
|
+
import { resolveOrganizationId } from '../organization/organization.js';
|
|
4
|
+
// Schema for the SearchAppTemplates API
|
|
5
|
+
export const SearchAppTemplatesRequestSchema = z.object({
|
|
6
|
+
organizationId: z.string().describe("组织ID"),
|
|
7
|
+
pagination: z.enum(['keyset']).optional().default('keyset').describe("分页模式参数,目前只支持键集分页 keyset 模式"),
|
|
8
|
+
perPage: z.number().optional().describe("分页尺寸参数,决定一页最多返回多少对象"),
|
|
9
|
+
orderBy: z.enum(['id', 'gmtCreate']).optional().default('id').describe("分页排序属性,决定根据何种属性进行记录排序;推荐在实现严格遍历时,使用 id 属性"),
|
|
10
|
+
sort: z.enum(['asc', 'desc']).optional().default('asc').describe("分页排序升降序,asc 为升序,desc 为降序;推荐在实现严格遍历时,使用升序"),
|
|
11
|
+
nextToken: z.string().optional().describe("键集分页 token,获取第一页数据时无需传入,否则需要传入前一页查询结果中的 nextToken 字段"),
|
|
12
|
+
displayNameKeyword: z.string().optional().describe("按展示名进行模糊搜索的关键字"),
|
|
13
|
+
page: z.number().optional().default(1).describe("页码分页时使用,用于获取下一页内容"),
|
|
14
|
+
});
|
|
15
|
+
export const SearchAppTemplatesResponseSchema = z.object({
|
|
16
|
+
current: z.number().optional().nullable().describe("页码分页时存在该字段,表示当前页"),
|
|
17
|
+
data: z.array(z.object({
|
|
18
|
+
cover: z.string().nullable().optional().describe("应用模板封面"),
|
|
19
|
+
creatorId: z.string().nullable().optional().describe("应用模板创建人"),
|
|
20
|
+
description: z.string().nullable().optional().describe("应用模板描述"),
|
|
21
|
+
displayName: z.string().nullable().optional().describe("应用模板展示名称"),
|
|
22
|
+
gmtCreate: z.string().nullable().optional().describe("应用模板创建时间"),
|
|
23
|
+
gmtModified: z.string().nullable().optional().describe("应用模板修改时间"),
|
|
24
|
+
modifierId: z.string().nullable().optional().describe("应用模板修改人"),
|
|
25
|
+
name: z.string().nullable().optional().describe("应用模板名称"),
|
|
26
|
+
type: z.enum(['CUSTOMIZE', 'PRESET']).nullable().optional().describe("应用模板类型"),
|
|
27
|
+
})).describe("分页结果数据"),
|
|
28
|
+
nextToken: z.string().nullable().optional().describe("采用键值分页时存在该字段,用于传给分页接口,迭代获取下一页数据"),
|
|
29
|
+
pages: z.number().nullable().optional().describe("页码分页时存在该字段,表示总页数"),
|
|
30
|
+
perPage: z.number().nullable().optional().describe("页码分页时存在该字段,表示每页大小"),
|
|
31
|
+
total: z.number().nullable().optional().describe("页码分页时存在该字段,表示结果总数"),
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Search application templates
|
|
35
|
+
*
|
|
36
|
+
* @param params - The request parameters
|
|
37
|
+
* @returns The list of application templates
|
|
38
|
+
*/
|
|
39
|
+
export async function searchAppTemplates(params) {
|
|
40
|
+
const { organizationId, ...queryParams } = params;
|
|
41
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
42
|
+
// Build query string properly
|
|
43
|
+
const query = {};
|
|
44
|
+
if (queryParams.pagination)
|
|
45
|
+
query.pagination = queryParams.pagination;
|
|
46
|
+
if (queryParams.perPage)
|
|
47
|
+
query.perPage = queryParams.perPage;
|
|
48
|
+
if (queryParams.orderBy)
|
|
49
|
+
query.orderBy = queryParams.orderBy;
|
|
50
|
+
if (queryParams.sort)
|
|
51
|
+
query.sort = queryParams.sort;
|
|
52
|
+
if (queryParams.nextToken)
|
|
53
|
+
query.nextToken = queryParams.nextToken;
|
|
54
|
+
if (queryParams.displayNameKeyword)
|
|
55
|
+
query.displayNameKeyword = queryParams.displayNameKeyword;
|
|
56
|
+
if (queryParams.page)
|
|
57
|
+
query.page = queryParams.page;
|
|
58
|
+
try {
|
|
59
|
+
// Build the full URL with query parameters
|
|
60
|
+
const baseUrl = isRegionEdition()
|
|
61
|
+
? `/oapi/v1/appstack/appTemplates:search`
|
|
62
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/appTemplates:search`;
|
|
63
|
+
const url = buildUrl(baseUrl, query);
|
|
64
|
+
const response = await yunxiaoRequest(url, {
|
|
65
|
+
method: 'GET',
|
|
66
|
+
});
|
|
67
|
+
return SearchAppTemplatesResponseSchema.parse(response);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { yunxiaoRequest, buildUrl, isRegionEdition } from '../../common/utils.js';
|
|
3
|
+
import { resolveOrganizationId } from '../organization/organization.js';
|
|
4
|
+
// Schema for the ListApplications API
|
|
5
|
+
export const ListApplicationsRequestSchema = z.object({
|
|
6
|
+
organizationId: z.string().describe("组织id"),
|
|
7
|
+
pagination: z.enum(['keyset']).default('keyset').describe("分页模式参数,目前只支持键集分页 keyset 模式"),
|
|
8
|
+
perPage: z.number().optional().describe("分页尺寸参数,决定一页最多返回多少对象"),
|
|
9
|
+
orderBy: z.string().optional().default("id").describe("分页排序属性,决定根据何种属性进行记录排序;推荐在实现严格遍历时,使用 id 属性"),
|
|
10
|
+
sort: z.enum(['asc', 'desc']).optional().default('asc').describe("分页排序为升降序,asc 为升序,desc 为降序;推荐在实现严格遍历时,使用升序"),
|
|
11
|
+
nextToken: z.string().optional().describe("分页 token,获取第一页数据时无需传入,否则需要传入前一页查询结果中的 nextToken 字段"),
|
|
12
|
+
});
|
|
13
|
+
export const ListApplicationsResponseSchema = z.object({
|
|
14
|
+
data: z.array(z.object({
|
|
15
|
+
appTemplateDisplayName: z.string().nullable().optional().describe("应用模版显示名称"),
|
|
16
|
+
appTemplateName: z.string().nullable().optional().describe("应用模版名称"),
|
|
17
|
+
creatorId: z.string().optional().describe("应用创建者id"),
|
|
18
|
+
description: z.string().optional().describe("应用描述"),
|
|
19
|
+
gmtCreate: z.string().optional().describe("创建时间"),
|
|
20
|
+
name: z.string().optional().describe("应用名"),
|
|
21
|
+
})),
|
|
22
|
+
nextToken: z.string().nullable().optional(),
|
|
23
|
+
});
|
|
24
|
+
// Schema for the GetApplication API
|
|
25
|
+
export const GetApplicationRequestSchema = z.object({
|
|
26
|
+
organizationId: z.string().describe("组织id"),
|
|
27
|
+
appName: z.string().describe("应用名"),
|
|
28
|
+
});
|
|
29
|
+
export const GetApplicationResponseSchema = z.object({
|
|
30
|
+
appTemplateDisplayName: z.string().nullable().optional().describe("应用模版展示名称"),
|
|
31
|
+
appTemplateName: z.string().nullable().optional().describe("应用模版名称"),
|
|
32
|
+
creatorId: z.string().optional().describe("应用创建者id"),
|
|
33
|
+
description: z.string().optional().describe("应用描述"),
|
|
34
|
+
gmtCreate: z.string().optional().describe("创建时间"),
|
|
35
|
+
name: z.string().optional().describe("应用名"),
|
|
36
|
+
});
|
|
37
|
+
// Schema for the CreateApplication API
|
|
38
|
+
export const CreateApplicationRequestSchema = z.object({
|
|
39
|
+
organizationId: z.string().describe("组织id"),
|
|
40
|
+
name: z.string().describe("应用名"),
|
|
41
|
+
appTemplateName: z.string().optional().describe("应用模板唯一名"),
|
|
42
|
+
description: z.string().optional().describe("应用描述"),
|
|
43
|
+
ownerId: z.string().optional().describe("应用 owner ID"),
|
|
44
|
+
tags: z.array(z.string()).optional().describe("应用标签"),
|
|
45
|
+
});
|
|
46
|
+
export const CreateApplicationResponseSchema = z.object({
|
|
47
|
+
appTemplateDisplayName: z.string().nullable().optional().describe("应用模版展示名称"),
|
|
48
|
+
appTemplateName: z.string().nullable().optional().describe("应用模版名称"),
|
|
49
|
+
creatorId: z.string().optional().describe("应用创建者id"),
|
|
50
|
+
description: z.string().optional().describe("应用描述"),
|
|
51
|
+
gmtCreate: z.string().optional().describe("创建时间"),
|
|
52
|
+
name: z.string().optional().describe("应用名"),
|
|
53
|
+
});
|
|
54
|
+
// Schema for the UpdateApplication API
|
|
55
|
+
export const UpdateApplicationRequestSchema = z.object({
|
|
56
|
+
organizationId: z.string().describe("组织id"),
|
|
57
|
+
appName: z.string().describe("应用名"),
|
|
58
|
+
ownerId: z.string().optional().describe("应用 owner ID"),
|
|
59
|
+
});
|
|
60
|
+
export const UpdateApplicationResponseSchema = z.object({
|
|
61
|
+
appTemplateDisplayName: z.string().nullable().optional().describe("应用模版展示名称"),
|
|
62
|
+
appTemplateName: z.string().nullable().optional().describe("应用模版名称"),
|
|
63
|
+
creatorId: z.string().optional().describe("应用创建者id"),
|
|
64
|
+
description: z.string().optional().describe("应用描述"),
|
|
65
|
+
gmtCreate: z.string().optional().describe("创建时间"),
|
|
66
|
+
name: z.string().optional().describe("应用名"),
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* List applications in an organization with pagination
|
|
70
|
+
*
|
|
71
|
+
* @param params - The request parameters
|
|
72
|
+
* @returns The list of applications
|
|
73
|
+
*/
|
|
74
|
+
export async function listApplications(params) {
|
|
75
|
+
const { organizationId, ...queryParams } = params;
|
|
76
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
77
|
+
// Build query string properly
|
|
78
|
+
const query = {};
|
|
79
|
+
if (queryParams.pagination)
|
|
80
|
+
query.pagination = queryParams.pagination;
|
|
81
|
+
if (queryParams.perPage)
|
|
82
|
+
query.perPage = queryParams.perPage;
|
|
83
|
+
if (queryParams.orderBy)
|
|
84
|
+
query.orderBy = queryParams.orderBy;
|
|
85
|
+
if (queryParams.sort)
|
|
86
|
+
query.sort = queryParams.sort;
|
|
87
|
+
if (queryParams.nextToken)
|
|
88
|
+
query.nextToken = queryParams.nextToken;
|
|
89
|
+
try {
|
|
90
|
+
// Build the full URL with query parameters
|
|
91
|
+
const baseUrl = isRegionEdition()
|
|
92
|
+
? `/oapi/v1/appstack/apps:search`
|
|
93
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps:search`;
|
|
94
|
+
const url = buildUrl(baseUrl, query);
|
|
95
|
+
const response = await yunxiaoRequest(url, {
|
|
96
|
+
method: 'GET',
|
|
97
|
+
});
|
|
98
|
+
return ListApplicationsResponseSchema.parse(response);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get application details by name
|
|
106
|
+
*
|
|
107
|
+
* @param params - The request parameters
|
|
108
|
+
* @returns The application details
|
|
109
|
+
*/
|
|
110
|
+
export async function getApplication(params) {
|
|
111
|
+
const { organizationId, appName } = params;
|
|
112
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
113
|
+
try {
|
|
114
|
+
const url = isRegionEdition()
|
|
115
|
+
? `/oapi/v1/appstack/apps/${appName}`
|
|
116
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}`;
|
|
117
|
+
const response = await yunxiaoRequest(url, {
|
|
118
|
+
method: 'GET',
|
|
119
|
+
});
|
|
120
|
+
return GetApplicationResponseSchema.parse(response);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create a new application
|
|
128
|
+
*
|
|
129
|
+
* @param params - The request parameters
|
|
130
|
+
* @returns The created application details
|
|
131
|
+
*/
|
|
132
|
+
export async function createApplication(params) {
|
|
133
|
+
const { organizationId, ...body } = params;
|
|
134
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
135
|
+
try {
|
|
136
|
+
const url = isRegionEdition()
|
|
137
|
+
? `/oapi/v1/appstack/apps`
|
|
138
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps`;
|
|
139
|
+
const response = await yunxiaoRequest(url, {
|
|
140
|
+
method: 'POST',
|
|
141
|
+
body: body,
|
|
142
|
+
});
|
|
143
|
+
return CreateApplicationResponseSchema.parse(response);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Update an existing application
|
|
151
|
+
*
|
|
152
|
+
* @param params - The request parameters
|
|
153
|
+
* @returns The updated application details
|
|
154
|
+
*/
|
|
155
|
+
export async function updateApplication(params) {
|
|
156
|
+
const { organizationId, appName, ...body } = params;
|
|
157
|
+
const finalOrgId = await resolveOrganizationId(organizationId);
|
|
158
|
+
try {
|
|
159
|
+
const url = isRegionEdition()
|
|
160
|
+
? `/oapi/v1/appstack/apps/${appName}`
|
|
161
|
+
: `/oapi/v1/appstack/organizations/${finalOrgId}/apps/${appName}`;
|
|
162
|
+
const response = await yunxiaoRequest(url, {
|
|
163
|
+
method: 'PUT',
|
|
164
|
+
body: body,
|
|
165
|
+
});
|
|
166
|
+
return UpdateApplicationResponseSchema.parse(response);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
}
|