flycode-mcp 1.9.2 → 1.11.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/README.md +151 -19
- package/dist/flycode-mcp.min.js +2 -0
- package/package.json +21 -8
- package/dist/clients/authClient.js +0 -43
- package/dist/clients/authClient.js.map +0 -1
- package/dist/clients/databaseFunctionClient.js +0 -16
- package/dist/clients/databaseFunctionClient.js.map +0 -1
- package/dist/clients/entityClient.js +0 -28
- package/dist/clients/entityClient.js.map +0 -1
- package/dist/clients/formClient.js +0 -30
- package/dist/clients/formClient.js.map +0 -1
- package/dist/clients/functionClient.js +0 -30
- package/dist/clients/functionClient.js.map +0 -1
- package/dist/clients/logicClient.js +0 -45
- package/dist/clients/logicClient.js.map +0 -1
- package/dist/clients/runClient.js +0 -16
- package/dist/clients/runClient.js.map +0 -1
- package/dist/clients/types.js +0 -7
- package/dist/clients/types.js.map +0 -1
- package/dist/index.js +0 -53
- package/dist/index.js.map +0 -1
- package/dist/service/auth.js +0 -84
- package/dist/service/auth.js.map +0 -1
- package/dist/service/logic.js +0 -261
- package/dist/service/logic.js.map +0 -1
- package/dist/store/tenant.js +0 -20
- package/dist/store/tenant.js.map +0 -1
- package/dist/store/token.js +0 -25
- package/dist/store/token.js.map +0 -1
- package/dist/tools/common.js +0 -61
- package/dist/tools/common.js.map +0 -1
- package/dist/tools/database-function/read.js +0 -98
- package/dist/tools/database-function/read.js.map +0 -1
- package/dist/tools/entity/read.js +0 -169
- package/dist/tools/entity/read.js.map +0 -1
- package/dist/tools/entity/schemas.js +0 -65
- package/dist/tools/entity/schemas.js.map +0 -1
- package/dist/tools/form/read.js +0 -202
- package/dist/tools/form/read.js.map +0 -1
- package/dist/tools/function/read.js +0 -187
- package/dist/tools/function/read.js.map +0 -1
- package/dist/tools/logic/read.js +0 -170
- package/dist/tools/logic/read.js.map +0 -1
- package/dist/tools/logic/schemas.js +0 -122
- package/dist/tools/logic/schemas.js.map +0 -1
- package/dist/tools/logic/write.js +0 -303
- package/dist/tools/logic/write.js.map +0 -1
- package/dist/tools/run/read.js +0 -65
- package/dist/tools/run/read.js.map +0 -1
- package/dist/utils/config.js +0 -26
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/date.js +0 -45
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/error.js +0 -30
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/mcp-types.js +0 -2
- package/dist/utils/mcp-types.js.map +0 -1
- package/dist/utils/request.js +0 -74
- package/dist/utils/request.js.map +0 -1
- package/dist/utils/snowflake.js +0 -119
- package/dist/utils/snowflake.js.map +0 -1
- package/dist/utils/str-replace.js +0 -353
- package/dist/utils/str-replace.js.map +0 -1
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import request from "../utils/request.js";
|
|
2
|
-
/**
|
|
3
|
-
* 分页列表查询业务领域
|
|
4
|
-
*
|
|
5
|
-
* @param data 请求参数
|
|
6
|
-
*/
|
|
7
|
-
export function pageModelLogicList(data) {
|
|
8
|
-
return request({
|
|
9
|
-
url: '/bizserv/bizmodel/pageModelLogicList',
|
|
10
|
-
method: 'post',
|
|
11
|
-
data,
|
|
12
|
-
type: 'tenant'
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 查询业务领域详情
|
|
17
|
-
*
|
|
18
|
-
* @param data
|
|
19
|
-
*/
|
|
20
|
-
export function getModelLogic(data) {
|
|
21
|
-
return request({
|
|
22
|
-
url: '/bizserv/bizmodel/getModelLogic',
|
|
23
|
-
method: 'post',
|
|
24
|
-
data,
|
|
25
|
-
type: 'tenant'
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* 保存业务领域
|
|
30
|
-
*
|
|
31
|
-
* @param data
|
|
32
|
-
*/
|
|
33
|
-
export function saveModelLogic(data) {
|
|
34
|
-
return request({
|
|
35
|
-
url: '/bizserv/bizmodel/saveModelLogic',
|
|
36
|
-
method: 'post',
|
|
37
|
-
data: {
|
|
38
|
-
...data,
|
|
39
|
-
// 保存时增加的字段
|
|
40
|
-
overwrite: false
|
|
41
|
-
},
|
|
42
|
-
type: 'tenant'
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=logicClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logicClient.js","sourceRoot":"","sources":["../../src/clients/logicClient.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,qBAAqB,CAAA;AAkHzC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAqB;IACtD,OAAO,OAAO,CAAoB;QAChC,GAAG,EAAE,sCAAsC;QAC3C,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;AACJ,CAAC;AAkUD;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB;IAC7C,OAAO,OAAO,CAAC;QACb,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAiB;IAC9C,OAAO,OAAO,CAAC;QACb,GAAG,EAAE,kCAAkC;QACvC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,GAAG,IAAI;YACP,WAAW;YACX,SAAS,EAAE,KAAK;SACjB;QACD,IAAI,EAAE,QAAQ;KACf,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import request from "../utils/request.js";
|
|
2
|
-
/**
|
|
3
|
-
* 执行 SQL 查询
|
|
4
|
-
*
|
|
5
|
-
* @param data 要执行的 SQL 语句
|
|
6
|
-
* @returns 响应结果
|
|
7
|
-
*/
|
|
8
|
-
export function sqlRun(data) {
|
|
9
|
-
return request({
|
|
10
|
-
url: '/api/biz/sqlrun',
|
|
11
|
-
method: 'post',
|
|
12
|
-
data,
|
|
13
|
-
type: 'business'
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=runClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runClient.js","sourceRoot":"","sources":["../../src/clients/runClient.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,qBAAqB,CAAA;AAoCzC;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,IAAkB;IACvC,OAAO,OAAO,CAAC;QACb,GAAG,EAAE,iBAAiB;QACtB,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,IAAI,EAAE,UAAU;KACjB,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/clients/types.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/clients/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
package/dist/index.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
-
import { authenticate } from './service/auth.js';
|
|
5
|
-
import { readTools as logicReadTools } from './tools/logic/read.js';
|
|
6
|
-
import { writeTools as logicWriteTools } from './tools/logic/write.js';
|
|
7
|
-
import { readTools as entityReadTools } from './tools/entity/read.js';
|
|
8
|
-
import { readTools as formReadTools } from './tools/form/read.js';
|
|
9
|
-
import { readTools as functionReadTools } from './tools/function/read.js';
|
|
10
|
-
import { readTools as databaseFunctionReadTools } from './tools/database-function/read.js';
|
|
11
|
-
import { readTools as runReadTools } from './tools/run/read.js';
|
|
12
|
-
import { commonTools } from './tools/common.js';
|
|
13
|
-
// 鉴权初始化(登录 -> 获取租户信息 -> 获取 IDE Token)
|
|
14
|
-
await authenticate();
|
|
15
|
-
// 创建 MCP 服务器
|
|
16
|
-
const server = new McpServer({
|
|
17
|
-
name: 'flycode-mcp',
|
|
18
|
-
version: '1.0.0',
|
|
19
|
-
});
|
|
20
|
-
// 注册工具:所有工具定义集中在 tools/ 下,按能力分类后在此统一注册
|
|
21
|
-
const allTools = [
|
|
22
|
-
...logicReadTools,
|
|
23
|
-
...logicWriteTools,
|
|
24
|
-
...entityReadTools,
|
|
25
|
-
...formReadTools,
|
|
26
|
-
...functionReadTools,
|
|
27
|
-
...databaseFunctionReadTools,
|
|
28
|
-
...runReadTools,
|
|
29
|
-
...commonTools,
|
|
30
|
-
];
|
|
31
|
-
for (const t of allTools) {
|
|
32
|
-
server.registerTool(t.name, t.config, t.handler);
|
|
33
|
-
}
|
|
34
|
-
// 启动服务
|
|
35
|
-
async function main() {
|
|
36
|
-
const transport = new StdioServerTransport();
|
|
37
|
-
await server.connect(transport);
|
|
38
|
-
// 清理资源,发送关闭消息给客户端
|
|
39
|
-
process.on('SIGINT', async () => {
|
|
40
|
-
await server.close();
|
|
41
|
-
process.exit(0);
|
|
42
|
-
});
|
|
43
|
-
process.on('SIGTERM', async () => {
|
|
44
|
-
await server.close();
|
|
45
|
-
process.exit(0);
|
|
46
|
-
});
|
|
47
|
-
console.error('flycode-mcp listening on stdio');
|
|
48
|
-
}
|
|
49
|
-
main().catch((e) => {
|
|
50
|
-
console.error(e);
|
|
51
|
-
process.exit(1);
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,UAAU,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,EAAE,SAAS,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACzE,OAAO,EAAE,SAAS,IAAI,yBAAyB,EAAE,MAAM,mCAAmC,CAAA;AAC1F,OAAO,EAAE,SAAS,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,sCAAsC;AACtC,MAAM,YAAY,EAAE,CAAA;AAEpB,aAAa;AACb,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAA;AAEF,uCAAuC;AACvC,MAAM,QAAQ,GAAc;IAC1B,GAAG,cAAc;IACjB,GAAG,eAAe;IAClB,GAAG,eAAe;IAClB,GAAG,aAAa;IAChB,GAAG,iBAAiB;IACpB,GAAG,yBAAyB;IAC5B,GAAG,YAAY;IACf,GAAG,WAAW;CACf,CAAA;AAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;IACzB,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;AAClD,CAAC;AAED,OAAO;AACP,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,kBAAkB;IAClB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAA;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/service/auth.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 鉴权初始化流程
|
|
3
|
-
*
|
|
4
|
-
* 依次完成:登录 -> 获取租户信息并匹配目标环境 -> 获取 IDE Token,
|
|
5
|
-
* 中间结果写入内存存储(token / tenant),供后续请求使用。
|
|
6
|
-
*/
|
|
7
|
-
import { config } from '../utils/config.js';
|
|
8
|
-
import { login, getTenantInfo, getIdeToken, APP_ID } from '../clients/authClient.js';
|
|
9
|
-
import { setToken } from "../store/token.js";
|
|
10
|
-
import { getTenant, setTenant } from "../store/tenant.js";
|
|
11
|
-
/**
|
|
12
|
-
* 执行完整鉴权流程,将 token 与租户信息写入内存存储。
|
|
13
|
-
*
|
|
14
|
-
* @throws 登录失败、未匹配到租户、获取 IDE Token 失败时抛出错误。
|
|
15
|
-
*/
|
|
16
|
-
export async function authenticate() {
|
|
17
|
-
// 登录
|
|
18
|
-
const loginResponse = await login({
|
|
19
|
-
appid: APP_ID,
|
|
20
|
-
username: config.username,
|
|
21
|
-
password: config.password,
|
|
22
|
-
});
|
|
23
|
-
if (loginResponse.code !== 200) {
|
|
24
|
-
throw new Error(`Unable to login: ${loginResponse.msg}`);
|
|
25
|
-
}
|
|
26
|
-
// 将 token 放到 storage
|
|
27
|
-
setToken(loginResponse.data.token);
|
|
28
|
-
console.error('flycode-mcp 登录完成');
|
|
29
|
-
// 获取租户信息
|
|
30
|
-
const tenantInfoResponse = await getTenantInfo();
|
|
31
|
-
// 匹配目标环境
|
|
32
|
-
const targetTenant = tenantInfoResponse.resp_data.find((tenant) => tenant.tenantcode === config.tenantCode);
|
|
33
|
-
const targetEnv = targetTenant?.envs.find((env) => env.envname === config.envName);
|
|
34
|
-
if (targetTenant && targetEnv) {
|
|
35
|
-
// env.conn 为 JSON 字符串,解析为连接信息;解析失败抛出明确错误而非裸异常
|
|
36
|
-
let conn;
|
|
37
|
-
try {
|
|
38
|
-
conn = JSON.parse(targetEnv.conn);
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
throw new Error(`租户环境连接信息解析失败, 租户号: ${config.tenantCode}, 环境名: ${config.envName}, ` +
|
|
42
|
-
`env.conn 不是合法的 JSON: ${targetEnv.conn}`);
|
|
43
|
-
}
|
|
44
|
-
// 保存信息到内存
|
|
45
|
-
setTenant({
|
|
46
|
-
metaModelCode: targetTenant.metamodelcode,
|
|
47
|
-
metaModelType: targetTenant.metamodeltype,
|
|
48
|
-
productCode: targetTenant.productcode,
|
|
49
|
-
productName: targetTenant.productname,
|
|
50
|
-
productSeriesCode: targetTenant.productseriescode,
|
|
51
|
-
productVersionCode: targetTenant.productversioncode,
|
|
52
|
-
productVersionName: targetTenant.productversionname,
|
|
53
|
-
tenantCode: targetTenant.tenantcode,
|
|
54
|
-
tenantName: targetTenant.tenantname,
|
|
55
|
-
conn,
|
|
56
|
-
envId: targetEnv.envid,
|
|
57
|
-
envName: targetEnv.envname,
|
|
58
|
-
tenantEnvName: targetEnv.tenantenvname
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
const tenantInfo = getTenant();
|
|
62
|
-
if (!tenantInfo) {
|
|
63
|
-
throw new Error(`没有找到匹配的租户信息, 租户号: ${config.tenantCode}, 环境名: ${config.envName}`);
|
|
64
|
-
}
|
|
65
|
-
console.error('flycode-mcp 获取租户信息完成');
|
|
66
|
-
// 获取 IDE Token
|
|
67
|
-
const ideTokenResponse = await getIdeToken({
|
|
68
|
-
appid: APP_ID,
|
|
69
|
-
envid: tenantInfo.envId,
|
|
70
|
-
metamodeltype: tenantInfo.metaModelType,
|
|
71
|
-
productcode: tenantInfo.productCode,
|
|
72
|
-
productversioncode: tenantInfo.productVersionCode,
|
|
73
|
-
tenantcode: tenantInfo.tenantCode
|
|
74
|
-
});
|
|
75
|
-
// resp_data / IDE token 缺失时给出明确报错
|
|
76
|
-
const ideToken = ideTokenResponse.resp_data?.idetoken;
|
|
77
|
-
if (!ideToken) {
|
|
78
|
-
throw new Error(`获取 IDE Token 失败, 租户号: ${tenantInfo.tenantCode}, 环境名: ${tenantInfo.envName}, ` +
|
|
79
|
-
`返回体中未包含有效的 idetoken`);
|
|
80
|
-
}
|
|
81
|
-
setToken(ideToken);
|
|
82
|
-
console.error('flycode-mcp 获取 IDE Token 完成');
|
|
83
|
-
}
|
|
84
|
-
//# sourceMappingURL=auth.js.map
|
package/dist/service/auth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/service/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/service/logic.js
DELETED
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { getModelLogic, saveModelLogic as saveModelLogicApi } from "../clients/logicClient.js";
|
|
2
|
-
import { formatDate } from "../utils/date.js";
|
|
3
|
-
import { extractError } from "../utils/error.js";
|
|
4
|
-
import { applyOps } from "../utils/str-replace.js";
|
|
5
|
-
/**
|
|
6
|
-
* service 层保存业务逻辑方法
|
|
7
|
-
*
|
|
8
|
-
* @param logic 完整的业务逻辑 JSON 对象
|
|
9
|
-
* @param commitMessage 提交信息
|
|
10
|
-
* @returns 操作结果消息
|
|
11
|
-
*/
|
|
12
|
-
export async function saveModelLogic(logic, commitMessage) {
|
|
13
|
-
// 提交类型是 saverecord 时,msgbody 固定填当前时间
|
|
14
|
-
if (commitMessage.committype === 'saverecord')
|
|
15
|
-
commitMessage.msgbody = formatDate(new Date(), 'YYYY-MM-DD HH:mm');
|
|
16
|
-
// 转成 JSON 文本保存到业务逻辑
|
|
17
|
-
logic.message = JSON.stringify(commitMessage);
|
|
18
|
-
try {
|
|
19
|
-
const result = await saveModelLogicApi(logic);
|
|
20
|
-
return result.resp_data;
|
|
21
|
-
}
|
|
22
|
-
catch (e) {
|
|
23
|
-
return extractError(e);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* 简易保存 flycode 的方法
|
|
28
|
-
* saveModelLogic 的参数需要完整的 LogicResult 对象,很大
|
|
29
|
-
* AI 调用 saveModelLogic 需要消耗很多上下文
|
|
30
|
-
* 但大多数情况整个 LogicResult 中只有 flycode 和 input 、output 会修改,其他内容都不变
|
|
31
|
-
* 故提供一个只需要接受 flycode 、input 和 output 的方法供 AI 使用
|
|
32
|
-
* 当 AI 修改的业务模型领域是 flycode 时,调用此方法进行保存
|
|
33
|
-
* 否则仍然调用 saveModelLogic 进行保存(如导出等不含 flycode 的特殊领域)
|
|
34
|
-
*
|
|
35
|
-
* 实现思路:先按 modellogiccode 拉取完整的 LogicResult(服务端返回的全部字段原样保留),
|
|
36
|
-
* 只把调用方传入的 flycode 写入 operations[0].templateparams.flycode,并可选地覆盖
|
|
37
|
-
* input / output,其余字段(modelcode、functionname、marktype 等)不动,最后复用
|
|
38
|
-
* saveModelLogic 落库,从而避免 AI 重复拼接、回传庞大的完整 JSON 。
|
|
39
|
-
*
|
|
40
|
-
* @param modelLogicCode 要保存的业务逻辑编码(modellogiccode)
|
|
41
|
-
* @param flycode flycode 脚本代码,写入 operations[0].templateparams.flycode
|
|
42
|
-
* @param input 输入参数(IN 结构),不传则保留原值;传空数组表示清空
|
|
43
|
-
* @param output 输出参数(OUT 结构),不传则保留原值;传空数组表示清空
|
|
44
|
-
* @param commitMessage 提交信息
|
|
45
|
-
* @returns 操作结果消息
|
|
46
|
-
*/
|
|
47
|
-
export async function simpleSaveFlyCodeModelLogic(modelLogicCode, flycode, input, output, commitMessage = { committype: 'saverecord', committypetext: '保存记录', msgbody: '' }) {
|
|
48
|
-
// 1. 拉取完整的 logic JSON(保留服务端返回的全部字段,仅覆盖需要变更的部分)
|
|
49
|
-
const res = await getModelLogic({ modellogiccode: modelLogicCode });
|
|
50
|
-
const logic = res.resp_data;
|
|
51
|
-
if (!logic || !logic.operations || logic.operations.length === 0) {
|
|
52
|
-
return JSON.stringify({
|
|
53
|
-
error: '该业务逻辑不含 operations(即没有 flycode 脚本),无法通过 simpleSaveFlyCodeModelLogic 保存',
|
|
54
|
-
hint: '请改用完整的 save_model_logic 工具,传入从 get_model_logic 查询到的完整 LogicResult 对象'
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
// 2. 更新其中的 flycode 和 input 和 output
|
|
58
|
-
// flycode 位于 operations[].templateparams.flycode,通常数组内只有单元素,更新首元素即可
|
|
59
|
-
// templateparams 在部分结构可能缺省/为空,做兜底:缺省时初始化一个对象再写入 flycode,
|
|
60
|
-
// 已存在时保留其 sourcemap / tempcompiledflycode 等其余字段
|
|
61
|
-
const op = logic.operations[0];
|
|
62
|
-
op.templateparams = { ...(op.templateparams ?? {}), flycode };
|
|
63
|
-
if (input !== undefined)
|
|
64
|
-
logic.input = input;
|
|
65
|
-
if (output !== undefined)
|
|
66
|
-
logic.output = output;
|
|
67
|
-
// 3. 复用 saveModelLogic 落库(内部会写入 commitMessage 并以 overwrite=false 保存)
|
|
68
|
-
return saveModelLogic(logic, commitMessage);
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* diff 总行数上限,避免批量改动把上下文又吃回去。
|
|
72
|
-
*/
|
|
73
|
-
const MAX_DIFF_LINES = 150;
|
|
74
|
-
/**
|
|
75
|
-
* 拼接各 op 的 hunk 为一份总 diff,并在超长时截断。
|
|
76
|
-
*/
|
|
77
|
-
function joinHunks(results) {
|
|
78
|
-
const hunks = results
|
|
79
|
-
.filter((r) => r.hunk)
|
|
80
|
-
.map((r) => `--- ops[${r.index}]${r.label ? ` (${r.label})` : ''} @ operation[${r.operationIndex}]\n${r.hunk}`);
|
|
81
|
-
if (hunks.length === 0)
|
|
82
|
-
return '';
|
|
83
|
-
const text = hunks.join('\n');
|
|
84
|
-
const lines = text.split('\n');
|
|
85
|
-
if (lines.length <= MAX_DIFF_LINES)
|
|
86
|
-
return text;
|
|
87
|
-
return `${lines.slice(0, MAX_DIFF_LINES).join('\n')}\n... diff 过长已截断(共 ${lines.length} 行)`;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* 写入提交信息并落库,返回是否成功。
|
|
91
|
-
*
|
|
92
|
-
* 与 saveModelLogic 的区别:saveModelLogic 在失败时也返回字符串,调用方无法区分成败;
|
|
93
|
-
* 而批量替换需要明确知道是否写成功(失败则不能回读校验),故这里返回 { ok, text }。
|
|
94
|
-
*/
|
|
95
|
-
async function commitAndSave(logic, commitMessage) {
|
|
96
|
-
if (commitMessage.committype === 'saverecord')
|
|
97
|
-
commitMessage.msgbody = formatDate(new Date(), 'YYYY-MM-DD HH:mm');
|
|
98
|
-
logic.message = JSON.stringify(commitMessage);
|
|
99
|
-
try {
|
|
100
|
-
// saveModelLogicApi 内部会附加 overwrite=false,服务端按版本拒绝冲突写入
|
|
101
|
-
const res = await saveModelLogicApi(logic);
|
|
102
|
-
return { ok: true, text: typeof res?.resp_data === 'string' ? res.resp_data : JSON.stringify(res?.resp_data ?? null) };
|
|
103
|
-
}
|
|
104
|
-
catch (e) {
|
|
105
|
-
return { ok: false, text: extractError(e) };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 批量局部替换 flycode 脚本(str_replace_editor 模式)。
|
|
110
|
-
*
|
|
111
|
-
* 与 simpleSaveFlyCodeModelLogic 的区别:后者需回传整份脚本,本方法只接收
|
|
112
|
-
* 改动片段(oldString / newString),由服务端拉取到的完整脚本上完成定位替换。
|
|
113
|
-
*
|
|
114
|
-
* 事务性实现(关键):
|
|
115
|
-
* 1. 只拉取一次完整 LogicResult,在内存副本上顺序预演全部 op;
|
|
116
|
-
* 2. 任一 op 失败(未命中 / 不唯一 / 参数非法)即整体中止,
|
|
117
|
-
* 由于此时尚未发起任何写请求,服务端状态从未改变,等价于「零写入回滚」;
|
|
118
|
-
* 3. 全部成功后只发起一次 saveModelLogic —— 事务边界即这一次写请求。
|
|
119
|
-
*
|
|
120
|
-
* 因此不存在「写一半再回滚」的中间态,比事后补偿更强。
|
|
121
|
-
*
|
|
122
|
-
* @param modelLogicCode 业务逻辑编码
|
|
123
|
-
* @param ops 替换操作数组,至少一个元素,按数组顺序依次作用于上一步结果
|
|
124
|
-
* @param commitMessage 提交信息,整批共用一个
|
|
125
|
-
* @param options dryRun / contextLines / verify
|
|
126
|
-
*/
|
|
127
|
-
export async function replaceFlyCodeSegments(modelLogicCode, ops, commitMessage, options = {}) {
|
|
128
|
-
const contextLines = options.contextLines ?? 3;
|
|
129
|
-
const dryRun = options.dryRun ?? false;
|
|
130
|
-
const verify = options.verify ?? true;
|
|
131
|
-
const abort = (errorCode, message) => ({
|
|
132
|
-
ok: false,
|
|
133
|
-
applied: false,
|
|
134
|
-
verified: null,
|
|
135
|
-
errorCode,
|
|
136
|
-
message,
|
|
137
|
-
lengthBefore: 0,
|
|
138
|
-
lengthAfter: 0,
|
|
139
|
-
diff: '',
|
|
140
|
-
ops: []
|
|
141
|
-
});
|
|
142
|
-
if (!Array.isArray(ops) || ops.length === 0) {
|
|
143
|
-
return abort('EMPTY_OPS', 'ops 至少需要一个元素');
|
|
144
|
-
}
|
|
145
|
-
// 1. 拉取完整对象(仅此一次读)
|
|
146
|
-
let logic;
|
|
147
|
-
try {
|
|
148
|
-
const res = await getModelLogic({ modellogiccode: modelLogicCode });
|
|
149
|
-
logic = res.resp_data;
|
|
150
|
-
}
|
|
151
|
-
catch (e) {
|
|
152
|
-
return abort('FETCH_FAILED', extractError(e));
|
|
153
|
-
}
|
|
154
|
-
if (!logic) {
|
|
155
|
-
return abort('FETCH_FAILED', `未查询到 modellogiccode=${modelLogicCode} 对应的业务逻辑`);
|
|
156
|
-
}
|
|
157
|
-
if (!logic.operations || logic.operations.length === 0) {
|
|
158
|
-
return abort('NO_OPERATIONS', '该业务逻辑不含 operations(即没有 flycode 脚本),请改用 save_model_logic 保存');
|
|
159
|
-
}
|
|
160
|
-
// 2. 取出各 operation 的脚本原文
|
|
161
|
-
const scripts = logic.operations.map((op) => op.templateparams?.flycode ?? '');
|
|
162
|
-
const lengthBefore = scripts.reduce((n, s) => n + s.length, 0);
|
|
163
|
-
// 3. 在内存副本上顺序预演全部 op(此时零写入)
|
|
164
|
-
const applied = applyOps(scripts, ops, { contextLines });
|
|
165
|
-
const diff = joinHunks(applied.results);
|
|
166
|
-
const lengthAfter = applied.scripts.reduce((n, s) => n + s.length, 0);
|
|
167
|
-
if (!applied.ok) {
|
|
168
|
-
const failed = applied.results.filter((r) => r.status === 'FAILED');
|
|
169
|
-
const idxText = failed.map((r) => r.index).join('、');
|
|
170
|
-
return {
|
|
171
|
-
ok: false,
|
|
172
|
-
applied: false,
|
|
173
|
-
verified: null,
|
|
174
|
-
errorCode: 'OPS_FAILED',
|
|
175
|
-
message: `预演失败:${failed.length} 个 op 未通过(ops[${idxText}])。本批次未产生任何写入,请根据 ops[].message / suggestions 修正后重试`,
|
|
176
|
-
lengthBefore,
|
|
177
|
-
lengthAfter,
|
|
178
|
-
diff,
|
|
179
|
-
ops: applied.results
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
if (dryRun) {
|
|
183
|
-
return {
|
|
184
|
-
ok: true,
|
|
185
|
-
applied: false,
|
|
186
|
-
verified: null,
|
|
187
|
-
errorCode: 'DRY_RUN',
|
|
188
|
-
message: `预演成功(dryRun=true),${ops.length} 个 op 全部命中,未落库`,
|
|
189
|
-
lengthBefore,
|
|
190
|
-
lengthAfter,
|
|
191
|
-
diff,
|
|
192
|
-
ops: applied.results
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
// 4. 写回:仅覆盖 flycode,templateparams 内的 sourcemap / tempcompiledflycode 等
|
|
196
|
-
// 字段随展开原样保留(服务端如何在就如何保留,本方法不擅自改动)
|
|
197
|
-
for (let i = 0; i < applied.scripts.length; i++) {
|
|
198
|
-
if (applied.scripts[i] !== scripts[i]) {
|
|
199
|
-
const tpl = logic.operations[i].templateparams;
|
|
200
|
-
logic.operations[i].templateparams = { ...(tpl ?? {}), flycode: applied.scripts[i] };
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// 5. 唯一一次落库
|
|
204
|
-
const saved = await commitAndSave(logic, commitMessage);
|
|
205
|
-
if (!saved.ok) {
|
|
206
|
-
return {
|
|
207
|
-
ok: false,
|
|
208
|
-
applied: false,
|
|
209
|
-
verified: null,
|
|
210
|
-
errorCode: 'SAVE_FAILED',
|
|
211
|
-
message: saved.text,
|
|
212
|
-
lengthBefore,
|
|
213
|
-
lengthAfter,
|
|
214
|
-
diff,
|
|
215
|
-
ops: applied.results
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
// 6. 回读校验:确认所有改动都真实落库(用于发现并发覆盖等异常)
|
|
219
|
-
let verified = null;
|
|
220
|
-
let message = saved.text;
|
|
221
|
-
if (verify) {
|
|
222
|
-
try {
|
|
223
|
-
const res = await getModelLogic({ modellogiccode: modelLogicCode });
|
|
224
|
-
const after = res.resp_data;
|
|
225
|
-
const afterScripts = (after?.operations ?? []).map((op) => op.templateparams?.flycode ?? '');
|
|
226
|
-
const problems = [];
|
|
227
|
-
applied.results.forEach((r, i) => {
|
|
228
|
-
const op = ops[i];
|
|
229
|
-
const text = afterScripts[r.operationIndex] ?? '';
|
|
230
|
-
// 新增内容应当存在(删除类改动 newString 为空串,跳过此断言)
|
|
231
|
-
if (op.newString.length > 0 && !text.includes(op.newString)) {
|
|
232
|
-
problems.push(`ops[${i}] 的新内容未出现在保存后的脚本中`);
|
|
233
|
-
}
|
|
234
|
-
// 原文应当消失(若新文本本身包含原文,如包裹式修改,则跳过此断言)
|
|
235
|
-
if (!op.newString.includes(op.oldString) && text.includes(op.oldString)) {
|
|
236
|
-
problems.push(`ops[${i}] 的 oldString 仍然存在于保存后的脚本中`);
|
|
237
|
-
}
|
|
238
|
-
});
|
|
239
|
-
verified = problems.length === 0;
|
|
240
|
-
if (problems.length > 0) {
|
|
241
|
-
message = `${saved.text} | 回读校验未通过:${problems.join(';')}`;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
catch (e) {
|
|
245
|
-
verified = false;
|
|
246
|
-
message = `${saved.text} | 回读校验失败:${extractError(e)}`;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
return {
|
|
250
|
-
ok: verified === null ? true : verified,
|
|
251
|
-
applied: true,
|
|
252
|
-
verified,
|
|
253
|
-
errorCode: verified === false ? 'VERIFY_FAILED' : 'OK',
|
|
254
|
-
message,
|
|
255
|
-
lengthBefore,
|
|
256
|
-
lengthAfter,
|
|
257
|
-
diff,
|
|
258
|
-
ops: applied.results
|
|
259
|
-
};
|
|
260
|
-
}
|
|
261
|
-
//# sourceMappingURL=logic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logic.js","sourceRoot":"","sources":["../../src/service/logic.ts"],"names":[],"mappings":"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"}
|
package/dist/store/tenant.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 租户信息存储器
|
|
3
|
-
*
|
|
4
|
-
* 租户信息:包含选择的租户的信息,以及租户具体环境的信息
|
|
5
|
-
*/
|
|
6
|
-
/** 内存中的租户信息缓存 */
|
|
7
|
-
let tenantInfo = null;
|
|
8
|
-
/** 设置内存中的租户信息缓存 */
|
|
9
|
-
export function setTenant(tenant) {
|
|
10
|
-
tenantInfo = tenant;
|
|
11
|
-
}
|
|
12
|
-
/** 返回内存中的租户信息缓存 */
|
|
13
|
-
export function getTenant() {
|
|
14
|
-
return tenantInfo;
|
|
15
|
-
}
|
|
16
|
-
/** 清除内存中的租户信息缓存 */
|
|
17
|
-
export function clearTenant() {
|
|
18
|
-
tenantInfo = null;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=tenant.js.map
|
package/dist/store/tenant.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../src/store/tenant.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8BH,iBAAiB;AACjB,IAAI,UAAU,GAAkB,IAAI,CAAA;AAEpC,mBAAmB;AACnB,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,UAAU,GAAG,MAAM,CAAA;AACrB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,mBAAmB;AACnB,MAAM,UAAU,WAAW;IACzB,UAAU,GAAG,IAAI,CAAA;AACnB,CAAC"}
|
package/dist/store/token.js
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 服务端 token 存储器。
|
|
3
|
-
*
|
|
4
|
-
* Node.js 环境没有浏览器里的 localStorage,用「内存」托管
|
|
5
|
-
* 鉴权 token:
|
|
6
|
-
* - 内存:适合运行时通过登录接口拿到 token 后缓存(例如 MCP 服务启动
|
|
7
|
-
* 时用 config 里的账号密码换取 token,再 setToken 写入)。
|
|
8
|
-
*
|
|
9
|
-
* 如需跨进程/重启持久化,建议把 token 放进环境变量,而非写本地文件。
|
|
10
|
-
*/
|
|
11
|
-
/** 内存中的 token 缓存 */
|
|
12
|
-
let memoryToken = null;
|
|
13
|
-
/** 写入/刷新运行时获取到的 token(登录成功后调用) */
|
|
14
|
-
export function setToken(token) {
|
|
15
|
-
memoryToken = token;
|
|
16
|
-
}
|
|
17
|
-
/** 读取 token:从内存缓存读取 */
|
|
18
|
-
export function getToken() {
|
|
19
|
-
return memoryToken;
|
|
20
|
-
}
|
|
21
|
-
/** 清除内存中的 token(登出/过期时调用) */
|
|
22
|
-
export function clearToken() {
|
|
23
|
-
memoryToken = null;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=token.js.map
|
package/dist/store/token.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/store/token.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oBAAoB;AACpB,IAAI,WAAW,GAAkB,IAAI,CAAA;AAErC,kCAAkC;AAClC,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,WAAW,GAAG,KAAK,CAAA;AACrB,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,QAAQ;IACtB,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,UAAU;IACxB,WAAW,GAAG,IAAI,CAAA;AACpB,CAAC"}
|
package/dist/tools/common.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { nextId } from '../utils/snowflake.js';
|
|
3
|
-
/**
|
|
4
|
-
* 通用工具:生成唯一编码(code)。
|
|
5
|
-
*
|
|
6
|
-
* 在新建实体、领域、表单等内容时,其 JSON 字段中通常需要携带一个唯一
|
|
7
|
-
* code(如实体的 objectcode、领域的 objecttypecode、表单的 formcode 等)。
|
|
8
|
-
* 本工具借助 @utils/snowflake 的雪花算法生成全局唯一 ID 作为该 code,
|
|
9
|
-
* 以字符串形式返回以避免超过 Number.MAX_SAFE_INTEGER 时的大整数精度丢失。
|
|
10
|
-
*/
|
|
11
|
-
export const commonTools = [
|
|
12
|
-
{
|
|
13
|
-
name: 'generate_unique_code',
|
|
14
|
-
config: {
|
|
15
|
-
title: '生成唯一编码',
|
|
16
|
-
description: '通过雪花算法(snowflake)生成一个全局唯一 ID(code)。在新建实体、领域、表单等内容时,其 JSON 字段中通常需要携带一个唯一 code,可调用本工具获取。',
|
|
17
|
-
inputSchema: {
|
|
18
|
-
prefix: z.string().optional().describe('可选前缀,拼接到生成的唯一 ID 之前(例如实体编码前缀);不传则只返回纯数字 ID 字符串')
|
|
19
|
-
},
|
|
20
|
-
outputSchema: {
|
|
21
|
-
code: z.string().describe('生成的唯一编码(code)。字符串形式以避免大整数精度丢失')
|
|
22
|
-
},
|
|
23
|
-
annotations: {
|
|
24
|
-
readOnlyHint: true, // 仅本地生成 ID,不修改任何服务端数据
|
|
25
|
-
destructiveHint: false, // 无破坏性
|
|
26
|
-
idempotentHint: false // 每次调用返回不同 ID
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
handler: async (args) => {
|
|
30
|
-
const { prefix = '' } = args;
|
|
31
|
-
try {
|
|
32
|
-
const id = nextId().toString();
|
|
33
|
-
const code = prefix ? `${prefix}${id}` : id;
|
|
34
|
-
const result = { code };
|
|
35
|
-
return {
|
|
36
|
-
content: [{
|
|
37
|
-
type: 'text',
|
|
38
|
-
text: JSON.stringify(result)
|
|
39
|
-
}],
|
|
40
|
-
// outputSchema 已在工具上声明,SDK 1.30 要求调用结果必须携带
|
|
41
|
-
// structuredContent 与之匹配,否则会抛 -32602;这里同时返回
|
|
42
|
-
// 文本(给人/模型阅读)和结构化内容(供 schema 校验)。
|
|
43
|
-
structuredContent: result
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
catch (e) {
|
|
47
|
-
// 雪花算法在时钟回拨过大等异常情况下会抛错,原样返回错误信息。
|
|
48
|
-
const err = e;
|
|
49
|
-
const body = { error: err.message ?? String(e) };
|
|
50
|
-
return {
|
|
51
|
-
isError: true,
|
|
52
|
-
content: [{
|
|
53
|
-
type: 'text',
|
|
54
|
-
text: JSON.stringify(body)
|
|
55
|
-
}]
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
];
|
|
61
|
-
//# sourceMappingURL=common.js.map
|
package/dist/tools/common.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE;YACN,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,wFAAwF;YACrG,WAAW,EAAE;gBACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;aACzF;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;aAC3D;YACD,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI,EAAO,sBAAsB;gBAC/C,eAAe,EAAE,KAAK,EAAG,OAAO;gBAChC,cAAc,EAAE,KAAK,CAAI,cAAc;aACxC;SACF;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,IAAI,CAAA;YAC5B,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAA;gBAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC3C,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAA;gBACvB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;yBAC7B,CAAC;oBACF,2CAA2C;oBAC3C,4CAA4C;oBAC5C,kCAAkC;oBAClC,iBAAiB,EAAE,MAA4C;iBAChE,CAAA;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,iCAAiC;gBACjC,MAAM,GAAG,GAAG,CAAyB,CAAA;gBACrC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;gBAChD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;yBAC3B,CAAC;iBACH,CAAA;YACH,CAAC;QACH,CAAC;KACF;CACF,CAAA"}
|