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.
Files changed (63) hide show
  1. package/README.md +151 -19
  2. package/dist/flycode-mcp.min.js +2 -0
  3. package/package.json +21 -8
  4. package/dist/clients/authClient.js +0 -43
  5. package/dist/clients/authClient.js.map +0 -1
  6. package/dist/clients/databaseFunctionClient.js +0 -16
  7. package/dist/clients/databaseFunctionClient.js.map +0 -1
  8. package/dist/clients/entityClient.js +0 -28
  9. package/dist/clients/entityClient.js.map +0 -1
  10. package/dist/clients/formClient.js +0 -30
  11. package/dist/clients/formClient.js.map +0 -1
  12. package/dist/clients/functionClient.js +0 -30
  13. package/dist/clients/functionClient.js.map +0 -1
  14. package/dist/clients/logicClient.js +0 -45
  15. package/dist/clients/logicClient.js.map +0 -1
  16. package/dist/clients/runClient.js +0 -16
  17. package/dist/clients/runClient.js.map +0 -1
  18. package/dist/clients/types.js +0 -7
  19. package/dist/clients/types.js.map +0 -1
  20. package/dist/index.js +0 -53
  21. package/dist/index.js.map +0 -1
  22. package/dist/service/auth.js +0 -84
  23. package/dist/service/auth.js.map +0 -1
  24. package/dist/service/logic.js +0 -261
  25. package/dist/service/logic.js.map +0 -1
  26. package/dist/store/tenant.js +0 -20
  27. package/dist/store/tenant.js.map +0 -1
  28. package/dist/store/token.js +0 -25
  29. package/dist/store/token.js.map +0 -1
  30. package/dist/tools/common.js +0 -61
  31. package/dist/tools/common.js.map +0 -1
  32. package/dist/tools/database-function/read.js +0 -98
  33. package/dist/tools/database-function/read.js.map +0 -1
  34. package/dist/tools/entity/read.js +0 -169
  35. package/dist/tools/entity/read.js.map +0 -1
  36. package/dist/tools/entity/schemas.js +0 -65
  37. package/dist/tools/entity/schemas.js.map +0 -1
  38. package/dist/tools/form/read.js +0 -202
  39. package/dist/tools/form/read.js.map +0 -1
  40. package/dist/tools/function/read.js +0 -187
  41. package/dist/tools/function/read.js.map +0 -1
  42. package/dist/tools/logic/read.js +0 -170
  43. package/dist/tools/logic/read.js.map +0 -1
  44. package/dist/tools/logic/schemas.js +0 -122
  45. package/dist/tools/logic/schemas.js.map +0 -1
  46. package/dist/tools/logic/write.js +0 -303
  47. package/dist/tools/logic/write.js.map +0 -1
  48. package/dist/tools/run/read.js +0 -65
  49. package/dist/tools/run/read.js.map +0 -1
  50. package/dist/utils/config.js +0 -26
  51. package/dist/utils/config.js.map +0 -1
  52. package/dist/utils/date.js +0 -45
  53. package/dist/utils/date.js.map +0 -1
  54. package/dist/utils/error.js +0 -30
  55. package/dist/utils/error.js.map +0 -1
  56. package/dist/utils/mcp-types.js +0 -2
  57. package/dist/utils/mcp-types.js.map +0 -1
  58. package/dist/utils/request.js +0 -74
  59. package/dist/utils/request.js.map +0 -1
  60. package/dist/utils/snowflake.js +0 -119
  61. package/dist/utils/snowflake.js.map +0 -1
  62. package/dist/utils/str-replace.js +0 -353
  63. package/dist/utils/str-replace.js.map +0 -1
@@ -1,303 +0,0 @@
1
- import { z } from 'zod';
2
- import { extractError } from '../../utils/error.js';
3
- import { saveModelLogic, simpleSaveFlyCodeModelLogic, replaceFlyCodeSegments } from '../../service/logic.js';
4
- import { logicResultSchema, logicParametersSchema } from './schemas.js';
5
- /**
6
- * 提交信息结构(CommitMessage)。
7
- */
8
- const commitMessageSchema = z.object({
9
- committype: z.enum(['saverecord', 'feature', 'fix', 'stylefix', 'refactor', 'testfix']).describe('提交类型,类型 committype 和名称 committypetext 一一对应'),
10
- committypetext: z.enum(['保存记录', '新功能添加', 'bug修改', '样式修改', '重构', '测试']).describe('提交类型名称,与 committype 一一对应'),
11
- msgbody: z.string().optional().describe('消息内容。提交类型为 saverecord 时忽略(服务端自动填当前时间,格式 yyyy-MM-dd hh:mm);其他类型填写对应提交内容,按 git 提交规范写')
12
- });
13
- /** 写入类工具:新增、更新、保存等会修改数据的操作。 */
14
- export const writeTools = [
15
- {
16
- name: 'save_model_logic',
17
- config: {
18
- title: '保存业务逻辑',
19
- description: `保存(新增或更新)一条业务逻辑。传入从 get_model_logic 查询得到的完整 LogicResult 对象,按需修改其中的 flycode 脚本(operations[].templateparams.flycode)、输入输出参数(input/output)或标题后回传,并附带提交信息 commitMessage。服务端按 overwrite=false 保存(不覆盖他人最新版本)。
20
-
21
- **注意**:
22
- 1.当仅需要修改 flycode ,不需要修改其他元数据时,优先使用 str_replace_flycode 工具。
23
- 2.当需要修改 input 、ouput 时,优先使用 simple_save_flycode_model_logic 工具。
24
- 3.只有 str_replace_flycode 和 simple_save_flycode_model_logic 无法满足,或需要创建新业务逻辑时,才考虑本工具。
25
-
26
- 【构造 LogicResult 的枚举速查】(字段含义与 get_model_logic 返回一致,原样回传即可)
27
- - actioncategory(行为类型):1-flycode接口;2-微服务;3-内部函数;4-导入;5-导出;6-flycode导入;7-flycode导出
28
- - actiontype(操作类型):1-列表查询;2-单个查询;3-数据提交;4-批量提交;5-导入;6-导出;7-离线数据获取;8-流程;9-业务调度;10-ipaas接口
29
- - execmode(执行方式):1-同步;2-异步
30
- - marktype(创建标记):0-平台;1-产品;2-租户
31
- - status(状态):1-启用
32
- - confsource(配置来源):1-IDE配置;2-用户级配置
33
- - input/output[].datatype(参数形态):0-单实体;1-数组
34
- - input/output[].properties[].propertytypecode(字段类型):1-主键(int8);2-名称(200);3-文本(200);4-长文本;5-整数(int4);6-长整数(int8);10-数字(numeric);7-日期时间(ts);30-时间范围;29-年月日(date);18-状态(int4);16-图片;26-附件;17-定位;19-选项集;200000000000-关联对象;100000000000-业务对象;10000000000-字典对象;300000000000-复杂关联对象;1000000000-本对象;8-创建人(int8);9-修改人(int8);11-创建时间(ts);12-修改时间(ts);31-拼音;100-是否默认;13-手机号;15-固定电话;14-邮箱;27-邮编;20-排序(int4)`,
35
- inputSchema: {
36
- logic: logicResultSchema.describe('完整的业务逻辑 JSON 对象(LogicResult),通常来自 get_model_logic 的返回,修改后回传'),
37
- commitMessage: commitMessageSchema.describe('提交信息,类型与名称需一一对应;msgbody 在非 saverecord 时必填')
38
- },
39
- outputSchema: {
40
- result: z.string().describe('保存操作的结果消息(服务端返回的 resp_data 字符串;失败时返回错误体 JSON)')
41
- },
42
- annotations: {
43
- readOnlyHint: false, // 此操作会修改数据
44
- destructiveHint: false, // 保存为非破坏性写入
45
- idempotentHint: false // 重复保存可能产生新的提交版本
46
- }
47
- },
48
- handler: async (args) => {
49
- const { logic, commitMessage } = args;
50
- // 兜底 msgbody:service 仅在 committype==='saverecord' 时自动填当前时间,
51
- // 其他类型若未传则给空字符串,避免把 undefined 透传给服务端。
52
- const commit = {
53
- committype: commitMessage.committype,
54
- committypetext: commitMessage.committypetext,
55
- msgbody: commitMessage.msgbody ?? ''
56
- };
57
- try {
58
- const text = await saveModelLogic(logic, commit);
59
- return {
60
- content: [{
61
- type: 'text',
62
- text
63
- }],
64
- // outputSchema 已在工具上声明,SDK 1.30 要求调用结果必须携带
65
- // structuredContent 与之匹配,否则会抛 -32602;这里同时返回
66
- // 文本(给人/模型阅读)和结构化内容(供 schema 校验)。
67
- structuredContent: { result: text }
68
- };
69
- }
70
- catch (e) {
71
- // service 层已捕获业务/网络错误并转为字符串返回,理论上极少走到这里;
72
- // 若 saveModelLogic 自身抛错(如入参非法),把原始错误体原样返回。
73
- const text = extractError(e);
74
- return {
75
- isError: true,
76
- content: [{
77
- type: 'text',
78
- text
79
- }],
80
- structuredContent: { result: text }
81
- };
82
- }
83
- }
84
- },
85
- {
86
- name: 'simple_save_flycode_model_logic',
87
- config: {
88
- title: '简易保存 flycode 业务逻辑',
89
- description: `保存(新增或更新)一条"含 flycode 脚本"的业务逻辑,但只需提供少量参数,大幅减少上下文占用。
90
-
91
- 与 save_model_logic 的区别:save_model_logic 需要回传从 get_model_logic 查到的完整 LogicResult 对象(往往很大,易因超长被截断);本工具只需传入 modellogiccode、flycode 以及(可选的)input / output,服务端会自动按 modellogiccode 拉取完整对象并只覆盖这几个字段,其余字段原样保留。
92
-
93
- 适用场景:你正在修改的业务逻辑领域是 flycode(actioncategory 为 1/6/7 等含 flycode 的类型),仅需变更脚本或输入/输出参数时,优先用本工具。
94
- 不适用场景:导出(actioncategory=5)等不含 flycode 的特殊领域,没有 operations 脚本结构,请改用完整的 save_model_logic 工具保存。
95
-
96
- 服务端按 overwrite=false 保存(不覆盖他人最新版本)。
97
-
98
- **注意:当仅需要修改 flycode ,不需要修改其他元数据时,优先使用 str_replace_flycode 工具。**
99
-
100
- 【input/output 参数枚举速查】(仅当传 input/output 时需要,结构同 logicParametersSchema)
101
- - datatype(参数形态):0-单实体(IN.name 是对象);1-数组(IN.name 是数组)
102
- - properties[].propertytypecode(字段类型):1-主键(int8);2-名称(200);3-文本(200);4-长文本;5-整数(int4);6-长整数(int8);10-数字(numeric);7-日期时间(ts);30-时间范围;29-年月日(date);18-状态(int4);16-图片;26-附件;17-定位;19-选项集;200000000000-关联对象;100000000000-业务对象;10000000000-字典对象;300000000000-复杂关联对象;1000000000-本对象;8-创建人(int8);9-修改人(int8);11-创建时间(ts);12-修改时间(ts);31-拼音;100-是否默认;13-手机号;15-固定电话;14-邮箱;27-邮编;20-排序(int4)`,
103
- inputSchema: {
104
- modelLogicCode: z.string().describe('要保存的业务逻辑的编码(即 get_model_logic 返回的 modellogiccode)'),
105
- flycode: z.string().describe('flycode 脚本代码字符串,将写入 operations[0].templateparams.flycode,覆盖原有脚本'),
106
- input: logicParametersSchema.optional().describe('输入参数(IN 结构)。不传则保留该业务逻辑原值;传空数组表示清空输入'),
107
- output: logicParametersSchema.optional().describe('输出参数(OUT 结构)。不传则保留该业务逻辑原值;传空数组表示清空输出'),
108
- commitMessage: commitMessageSchema.describe('提交信息,类型与名称需一一对应;msgbody 在非 saverecord 时必填')
109
- },
110
- outputSchema: {
111
- result: z.string().describe('保存操作的结果消息(服务端返回的 resp_data 字符串;失败时返回错误体 JSON)')
112
- },
113
- annotations: {
114
- readOnlyHint: false, // 此操作会修改数据
115
- destructiveHint: false, // 保存为非破坏性写入
116
- idempotentHint: false // 重复保存可能产生新的提交版本
117
- }
118
- },
119
- handler: async (args) => {
120
- const { modelLogicCode, flycode, input, output, commitMessage } = args;
121
- // 兜底 msgbody:service 仅在 committype==='saverecord' 时自动填当前时间,
122
- // 其他类型若未传则给空字符串,避免把 undefined 透传给服务端。
123
- const commit = {
124
- committype: commitMessage.committype,
125
- committypetext: commitMessage.committypetext,
126
- msgbody: commitMessage.msgbody ?? ''
127
- };
128
- try {
129
- const text = await simpleSaveFlyCodeModelLogic(modelLogicCode, flycode, input, output, commit);
130
- return {
131
- content: [{
132
- type: 'text',
133
- text
134
- }],
135
- // outputSchema 已在工具上声明,SDK 1.30 要求调用结果必须携带
136
- // structuredContent 与之匹配,否则会抛 -32602;这里同时返回
137
- // 文本(给人/模型阅读)和结构化内容(供 schema 校验)。
138
- structuredContent: { result: text }
139
- };
140
- }
141
- catch (e) {
142
- // simpleSaveFlyCodeModelLogic 内 getModelLogic 拉取失败等异常会透传到这里,
143
- // 把原始错误体原样返回。
144
- const text = extractError(e);
145
- return {
146
- isError: true,
147
- content: [{
148
- type: 'text',
149
- text
150
- }],
151
- structuredContent: { result: text }
152
- };
153
- }
154
- }
155
- },
156
- {
157
- name: 'str_replace_flycode',
158
- config: {
159
- title: '批量局部替换 flycode 脚本',
160
- description: `以 str_replace_editor 模式局部修改业务逻辑的 flycode 脚本:只需传入要改动的新旧代码片段(oldString / newString),不必回传整份脚本,由服务端拉取完整对象后完成定位与替换,大幅节省上下文。
161
-
162
- 【何时用本工具 / 何时用别的】
163
- - 改 1~N 处局部片段(最常用)→ 本工具,一次调用可批量提交多个 ops
164
- - 整份脚本重写、大范围重构 → simple_save_flycode_model_logic
165
- - 非 flycode 领域(导出等)或要改 input / output 结构 → save_model_logic
166
-
167
- 【事务性】ops 具备事务性:全部 op 预演成功才会落库,任一 op 失败则整批中止、不产生任何写入(零写入回滚)。实现上整批只发起一次保存请求,不存在写一半的中间态。
168
-
169
- 【执行顺序】ops 按数组顺序依次执行,ops[i+1] 在 ops[i] 的结果上匹配,因此允许「先插入一段代码,再改这段里的某行」这类依赖;反之若 ops[i+1] 的原文已被 ops[i] 删除,则报 NOT_FOUND 并整批中止。
170
-
171
- 【oldString 书写要求(决定成败)】
172
- - 必须非空,且在目标脚本中唯一命中(否则报 NOT_UNIQUE)
173
- - 推荐 3~10 行,务必包含一处能区分于其他位置的上下文;太短容易多命中
174
- - 直接从查询到的脚本原文里复制,不要凭记忆重写;缩进、空行、换行都要一致
175
- - 匹配默认容忍换行符差异(CRLF / LF)与行尾空白差异;需要字节严格相等时把 matchMode 设为 exact
176
- - 命中多处的相同片段:用 occurrence 指定改第几处,或 replaceAll=true 全部替换
177
-
178
- 【失败后的自纠】返回体中 ops[].message 说明原因;NOT_FOUND 时 ops[].suggestions 会给出最相似的候选(含行号与相似度),据此修正 oldString 后重试即可。改动较大或不确定是否唯一时,建议先 dryRun=true 预览 diff 再正式提交。`,
179
- inputSchema: {
180
- modelLogicCode: z.string().describe('要修改的业务逻辑的编码(即 get_model_logic 返回的 modellogiccode)'),
181
- ops: z.array(z.object({
182
- oldString: z.string().describe('待替换的原文片段,必须非空且在目标脚本中唯一命中;请从查询到的脚本原文原样复制(含缩进与换行)'),
183
- newString: z.string().describe('替换后的新文本;传空字符串表示删除 oldString 这段内容'),
184
- operationIndex: z.number().int().nonnegative().optional().describe('作用于第几个 operation 的 flycode 脚本,默认 0。多数业务逻辑只有一个 operation,无需传'),
185
- replaceAll: z.boolean().optional().describe('是否替换全部匹配,默认 false。与 occurrence 互斥,仅在你确认要改掉所有同名片段时置 true'),
186
- occurrence: z.number().int().positive().optional().describe('只替换第 N 个匹配(1-based),用于「多处相同片段只改其中一处」;与 replaceAll 互斥'),
187
- matchMode: z.enum(['exact', 'normalized']).optional().describe('匹配严格度,默认 normalized(容忍 CRLF/LF 与行尾空白差异);exact 为字节严格相等'),
188
- label: z.string().optional().describe('可选标识,仅用于在返回报告中辨认该 op,不影响执行')
189
- })).min(1).describe('替换操作数组,至少一个元素;按数组顺序依次执行,全部成功才落库'),
190
- commitMessage: commitMessageSchema.describe('提交信息,整批 ops 共用一个;类型与名称需一一对应,msgbody 在非 saverecord 时必填'),
191
- dryRun: z.boolean().optional().describe('只预演并输出 diff、不落库,默认 false。改动较大或不确定 oldString 是否唯一时建议先置 true'),
192
- contextLines: z.number().int().min(0).max(10).optional().describe('diff 中每个改动点上下保留的上下文行数,默认 3'),
193
- verify: z.boolean().optional().describe('保存后是否回读校验所有改动已生效,默认 true')
194
- },
195
- outputSchema: {
196
- ok: z.boolean().describe('整体是否成功(dryRun 成功也为 true,但 applied=false)'),
197
- applied: z.boolean().describe('是否已落库;dryRun 或任一 op 预演失败时为 false'),
198
- verified: z.boolean().nullable().describe('保存后回读校验结果:true 全部生效、false 存在异常、null 未落库或未开启校验'),
199
- errorCode: z.string().describe('错误码:OK / DRY_RUN / EMPTY_OPS / FETCH_FAILED / NO_OPERATIONS / OPS_FAILED / SAVE_FAILED / VERIFY_FAILED'),
200
- message: z.string().describe('结果说明;失败时给出可直接执行的处理建议'),
201
- lengthBefore: z.coerce.number().describe('替换前脚本总字符数'),
202
- lengthAfter: z.coerce.number().describe('替换后脚本总字符数'),
203
- diff: z.string().describe('全部 op 的 diff 片段(unified hunk 形态),超长会截断;此处只回改动片段,不回整份脚本'),
204
- ops: z.array(z.object({
205
- index: z.coerce.number().describe('在 ops 数组中的下标'),
206
- label: z.string().nullable().describe('调用方传入的标识'),
207
- status: z.string().describe('该 op 的执行状态:OK / FAILED'),
208
- errorCode: z.string().describe('该 op 的错误码:OK / EMPTY_OLD_STRING / NOT_FOUND / NOT_UNIQUE / NO_TARGET / INVALID_PARAMS / OCCURRENCE_OUT_OF_RANGE'),
209
- message: z.string().nullable().describe('失败原因说明,成功时为 null'),
210
- operationIndex: z.coerce.number().describe('实际作用的 operation 下标'),
211
- matchCount: z.coerce.number().describe('oldString 的匹配总数'),
212
- replacedCount: z.coerce.number().describe('实际替换的处数'),
213
- range: z.object({
214
- startOffset: z.coerce.number().describe('起始字符偏移'),
215
- endOffset: z.coerce.number().describe('结束字符偏移(不含)'),
216
- startLine: z.coerce.number().describe('起始行号,1-based'),
217
- endLine: z.coerce.number().describe('结束行号,1-based')
218
- }).nullable().describe('首个替换点的位置,未执行时为 null'),
219
- suggestions: z.array(z.object({
220
- startLine: z.coerce.number().describe('候选片段起始行号'),
221
- score: z.coerce.number().describe('相似度,0~1'),
222
- preview: z.string().describe('候选片段预览')
223
- })).nullable().describe('NOT_FOUND 时的相似候选,供修正 oldString 参考'),
224
- dependentOnFailedOp: z.boolean().describe('前序 op 已失败时为 true,表示本 op 的结果可能受其影响'),
225
- hunk: z.string().nullable().describe('该 op 产生的 diff 片段')
226
- })).describe('每个 op 的执行结果,与入参 ops 一一对应')
227
- },
228
- annotations: {
229
- readOnlyHint: false, // 此操作会修改数据
230
- destructiveHint: false, // 局部替换为非破坏性写入,且有事务性保护
231
- idempotentHint: false // 成功后重复调用会因 oldString 已不存在而失败(fail-closed)
232
- }
233
- },
234
- handler: async (args) => {
235
- const { modelLogicCode, ops, commitMessage, dryRun = false, contextLines = 3, verify = true } = args;
236
- // 兜底 msgbody:service 仅在 committype==='saverecord' 时自动填当前时间,
237
- // 其他类型若未传则给空字符串,避免把 undefined 透传给服务端。
238
- const commit = {
239
- committype: commitMessage.committype,
240
- committypetext: commitMessage.committypetext,
241
- msgbody: commitMessage.msgbody ?? ''
242
- };
243
- try {
244
- const result = await replaceFlyCodeSegments(modelLogicCode, ops, commit, { dryRun, contextLines, verify });
245
- // content 保持精简:只回状态、每个 op 的结论与 diff,不回整份脚本,
246
- // 避免把大文本塞两份(content 与 structuredContent 各一份)。
247
- return {
248
- isError: !result.ok,
249
- content: [{
250
- type: 'text',
251
- text: JSON.stringify({
252
- ok: result.ok,
253
- applied: result.applied,
254
- verified: result.verified,
255
- errorCode: result.errorCode,
256
- message: result.message,
257
- ops: result.ops.map((o) => ({
258
- index: o.index,
259
- status: o.status,
260
- errorCode: o.errorCode,
261
- message: o.message,
262
- operationIndex: o.operationIndex,
263
- matchCount: o.matchCount,
264
- replacedCount: o.replacedCount,
265
- range: o.range,
266
- suggestions: o.suggestions,
267
- dependentOnFailedOp: o.dependentOnFailedOp
268
- })),
269
- diff: result.diff
270
- })
271
- }],
272
- // outputSchema 已在工具上声明,SDK 1.30 要求调用结果必须携带
273
- // structuredContent 与之匹配,否则会抛 -32602。
274
- structuredContent: result
275
- };
276
- }
277
- catch (e) {
278
- // replaceFlyCodeSegments 内部已捕获业务/网络错误,走到这里通常是入参非法等意外;
279
- // 把原始错误体原样返回,并保证 structuredContent 与 outputSchema 形状一致。
280
- const text = extractError(e);
281
- return {
282
- isError: true,
283
- content: [{
284
- type: 'text',
285
- text
286
- }],
287
- structuredContent: {
288
- ok: false,
289
- applied: false,
290
- verified: null,
291
- errorCode: 'SAVE_FAILED',
292
- message: text,
293
- lengthBefore: 0,
294
- lengthAfter: 0,
295
- diff: '',
296
- ops: []
297
- }
298
- };
299
- }
300
- }
301
- }
302
- ];
303
- //# sourceMappingURL=write.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"write.js","sourceRoot":"","sources":["../../../src/tools/logic/write.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- import { z } from 'zod';
2
- import { extractError } from '../../utils/error.js';
3
- import { sqlRun } from '../../clients/runClient.js';
4
- /**
5
- * 执行 SQL 查询结果(SqlRunResult)的 outputSchema 形状。
6
- * 字段类型严格依据 runClient.ts 中的 SqlRunResult 接口声明构建:
7
- * - data:查询结果数据,接口声明为 unknown[] | null(可选且可空),每行是一条记录对象。
8
- * 由于每行内部结构无法提前约束,统一以 z.unknown() 承接,保证服务端返回的任何行都能通过校验。
9
- * - influenceCount:查询结果总数,接口声明为 number | null(可选且可空);对字符串型数字用 z.coerce.number() 容错。
10
- * 使用 z.looseObject 实现服务端偶发返回的额外字段原样透传,避免 -32602 Output validation 报错。
11
- * 描述文字直接采用 runClient.ts 中 SqlRunResult 各字段的注释内容。
12
- */
13
- const sqlRunResultShape = {
14
- data: z.array(z.unknown()).nullable().optional().describe('查询结果数据,数组中的每一项为一条查询结果记录(对象)'),
15
- influenceCount: z.coerce.number().nullable().optional().describe('查询结果总数')
16
- };
17
- /** 只读类工具:查询、列表、读取等不会修改数据的操作。 */
18
- export const readTools = [
19
- {
20
- name: 'run_sql',
21
- config: {
22
- title: '执行 SQL 查询',
23
- description: '在业务库(数据库为 PostgreSQL)中执行一条 SELECT 查询 SQL(接口仅支持 SELECT,一次只能一条 SQL,只能查业务表的数据,需要查表有哪些字段请使用 get_entity ),返回查询结果数据 data 与结果总数 influenceCount。适用于直接探查业务表数据、核对字段值、验证同步结果等只读场景。',
24
- inputSchema: {
25
- sql: z.string().describe('要执行的 SQL 查询语句,只支持 SELECT 查询,一次只能一条 SQL')
26
- },
27
- // z.looseObject 实现有额外字段时原样透传
28
- outputSchema: z.looseObject(sqlRunResultShape),
29
- annotations: {
30
- readOnlyHint: true, // 此操作只执行 SELECT 查询,不会修改数据
31
- destructiveHint: false, // 此操作不具有破坏性
32
- idempotentHint: true // 重复执行同一条 SELECT 结果相同
33
- }
34
- },
35
- handler: async (args) => {
36
- const { sql } = args;
37
- try {
38
- const res = await sqlRun({ sql });
39
- return {
40
- content: [{
41
- type: 'text',
42
- text: JSON.stringify(res.resp_data)
43
- }],
44
- // outputSchema 已在工具上声明,SDK 1.30 要求调用结果必须携带
45
- // structuredContent 与之匹配,否则会抛 -32602;这里同时返回
46
- // 文本(给人/模型阅读)和结构化内容(供 schema 校验)。
47
- structuredContent: res.resp_data
48
- };
49
- }
50
- catch (e) {
51
- // 业务/网络错误:HTTP 非 200 时 Axios 已在传输层抛出,
52
- // 错误体形如 {"error_type":600,"error_code":"token无效,请重新登录","error_params":null}
53
- // 将其原始 JSON 原样返回给模型,不做二次包装。
54
- return {
55
- isError: true,
56
- content: [{
57
- type: 'text',
58
- text: extractError(e)
59
- }]
60
- };
61
- }
62
- }
63
- }
64
- ];
65
- //# sourceMappingURL=read.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/tools/run/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGnD;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACxF,cAAc,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;CACrD,CAAA;AAEvB,gCAAgC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC;QACE,IAAI,EAAE,SAAS;QACf,MAAM,EAAE;YACN,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,yKAAyK;YACtL,WAAW,EAAE;gBACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;aACnE;YACD,6BAA6B;YAC7B,YAAY,EAAE,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAA2B;YACxE,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI,EAAM,0BAA0B;gBAClD,eAAe,EAAE,KAAK,EAAE,YAAY;gBACpC,cAAc,EAAE,IAAI,CAAI,sBAAsB;aAC/C;SACF;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACtB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;gBACjC,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;yBACpC,CAAC;oBACF,2CAA2C;oBAC3C,4CAA4C;oBAC5C,kCAAkC;oBAClC,iBAAiB,EAAE,GAAG,CAAC,SAA+C;iBACvE,CAAA;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,sCAAsC;gBACtC,4EAA4E;gBAC5E,4BAA4B;gBAC5B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;yBACtB,CAAC;iBACH,CAAA;YACH,CAAC;QACH,CAAC;KACF;CACF,CAAA"}
@@ -1,26 +0,0 @@
1
- export const BASE_URL = "http://mconfig.xuantongkeji.com:51074";
2
- // username=xxx&password=xxx&tenantCode=xxx&envName=xxx
3
- export const USERNAME_KEY = 'username';
4
- export const PASSWORD_KEY = 'password';
5
- export const TENANT_CODE_KEY = 'tenantCode';
6
- export const ENV_NAME_KEY = 'envName';
7
- function req(name, fallback) {
8
- const args = process.argv.slice(2);
9
- const query = args.join('&');
10
- const params = new URLSearchParams(query);
11
- const v = params.get(name);
12
- if (v !== null && v !== '') {
13
- return v;
14
- }
15
- if (fallback !== undefined) {
16
- return fallback;
17
- }
18
- throw new Error(`Missing required arg: ${name}`);
19
- }
20
- export const config = {
21
- username: req(USERNAME_KEY),
22
- password: req(PASSWORD_KEY),
23
- tenantCode: req(TENANT_CODE_KEY),
24
- envName: req(ENV_NAME_KEY),
25
- };
26
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,uCAAuC,CAAA;AAE/D,uDAAuD;AACvD,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,CAAA;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,YAAY,CAAA;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAG,SAAS,CAAA;AASrC,SAAS,GAAG,CAAC,IAAY,EAAE,QAAiB;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5B,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAA;IAEzC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAW;IAC5B,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;IAC3B,QAAQ,EAAE,GAAG,CAAC,YAAY,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC,eAAe,CAAC;IAChC,OAAO,EAAE,GAAG,CAAC,YAAY,CAAC;CAC3B,CAAA"}
@@ -1,45 +0,0 @@
1
- /**
2
- * 将 Date 对象按照给定的格式字符串进行格式化
3
- * @param date - 要格式化的日期对象
4
- * @param format - 格式字符串,支持以下占位符:
5
- * - YYYY / YY : 四位 / 两位年份
6
- * - MM / M : 两位 / 一位月份(1-12)
7
- * - DD / D : 两位 / 一位日期(1-31)
8
- * - HH / H : 两位 / 一位小时(0-23)
9
- * - mm / m : 两位 / 一位分钟(0-59)
10
- * - ss / s : 两位 / 一位秒数(0-59)
11
- * - SSS : 三位毫秒(000-999)
12
- * @returns 格式化后的日期字符串
13
- * @throws 当 date 无效时抛出错误
14
- */
15
- export function formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
16
- // 检查日期是否有效
17
- if (isNaN(date.getTime())) {
18
- throw new Error('Invalid date provided');
19
- }
20
- // 定义占位符与对应值的映射(值均为字符串)
21
- const replacements = {
22
- YYYY: date.getFullYear().toString(),
23
- YY: date.getFullYear().toString().slice(-2),
24
- MM: String(date.getMonth() + 1).padStart(2, '0'),
25
- M: String(date.getMonth() + 1),
26
- DD: String(date.getDate()).padStart(2, '0'),
27
- D: String(date.getDate()),
28
- HH: String(date.getHours()).padStart(2, '0'),
29
- H: String(date.getHours()),
30
- mm: String(date.getMinutes()).padStart(2, '0'),
31
- m: String(date.getMinutes()),
32
- ss: String(date.getSeconds()).padStart(2, '0'),
33
- s: String(date.getSeconds()),
34
- SSS: String(date.getMilliseconds()).padStart(3, '0'),
35
- };
36
- // 按占位符长度降序排列,确保优先替换较长的(如 YYYY 先于 YY)
37
- const keys = Object.keys(replacements).sort((a, b) => b.length - a.length);
38
- let result = format;
39
- for (const key of keys) {
40
- // 全局替换,注意转义正则特殊字符(本例中占位符均为字母,无需转义)
41
- result = result.replace(new RegExp(key, 'g'), replacements[key]);
42
- }
43
- return result;
44
- }
45
- //# sourceMappingURL=date.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"date.js","sourceRoot":"","sources":["../../src/utils/date.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,MAAM,GAAW,qBAAqB;IAC3E,WAAW;IACX,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;IAC1C,CAAC;IAED,uBAAuB;IACvB,MAAM,YAAY,GAA2B;QAC3C,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACnC,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAChD,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC9B,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3C,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5C,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC1B,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC9C,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC9C,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5B,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;KACrD,CAAA;IAED,qCAAqC;IACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAA;IAE1E,IAAI,MAAM,GAAG,MAAM,CAAA;IACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,mCAAmC;QACnC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1,30 +0,0 @@
1
- /**
2
- * 统一提取错误信息为可读字符串,供 MCP 工具的 catch 兜底使用。
3
- *
4
- * 背景:原先各 handler 的 catch 直接 `JSON.stringify(err)` 兜底,
5
- * 而 Error 实例的 message 等字段多为非枚举属性,`JSON.stringify`
6
- * 会得到 `"{}"`,导致模型只看到空对象、无法获知真实失败原因
7
- * (见代码审查 #3 / #8)。此函数把该逻辑收敛到一处。
8
- *
9
- * 规则:
10
- * - AxiosError(携带 response.data):优先返回服务端响应体,保持原行为,
11
- * 将后端错误 JSON 原样透传给模型,不做二次包装。
12
- * - 普通 Error / 其他:返回 e.message(或最终的 String(e) 兜底),
13
- * 避免信息丢失。
14
- */
15
- export function extractError(e) {
16
- const err = e;
17
- if (err?.response?.data != null) {
18
- try {
19
- return JSON.stringify(err.response.data);
20
- }
21
- catch {
22
- return String(err.response.data);
23
- }
24
- }
25
- if (e instanceof Error) {
26
- return e.message;
27
- }
28
- return String(e);
29
- }
30
- //# sourceMappingURL=error.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/utils/error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,MAAM,GAAG,GAAG,CAAyD,CAAA;IACrE,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC;IACH,CAAC;IACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,OAAO,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAClB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mcp-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-types.js","sourceRoot":"","sources":["../../src/utils/mcp-types.ts"],"names":[],"mappings":""}
@@ -1,74 +0,0 @@
1
- import axios from "axios";
2
- import { BASE_URL } from "./config.js";
3
- import { getToken } from "../store/token.js";
4
- import { getTenant } from "../store/tenant.js";
5
- /**
6
- * 内部 axios 实例,统一配置超时与基础地址。
7
- * baseURL 为默认值(center),具体请求可在 request() 中按 type 覆盖。
8
- */
9
- const service = axios.create({
10
- baseURL: BASE_URL || "",
11
- timeout: 20000,
12
- headers: {
13
- "Content-Type": "application/json",
14
- },
15
- });
16
- /**
17
- * 请求拦截器:从 token 存储器读取 token(环境变量或内存缓存),
18
- * 若已鉴权则注入到请求头,key 为 `token`,使后续业务请求自动携带鉴权信息。
19
- */
20
- service.interceptors.request.use((config) => {
21
- const token = getToken();
22
- if (token) {
23
- config.headers = config.headers || {};
24
- config.headers.token = token;
25
- }
26
- return config;
27
- });
28
- /**
29
- * 响应拦截器:剥离 AxiosResponse 包装,直接返回响应体 data,
30
- * 使 `request<T>()` 的返回类型即为业务数据类型 T。
31
- */
32
- service.interceptors.response.use((response) => response.data, (error) => Promise.reject(error));
33
- /**
34
- * 统一请求入口。
35
- *
36
- * 用法:
37
- * ```ts
38
- * // 中心服务(默认)
39
- * request<Resp>({ url: "/api/x", method: "post", data: {} })
40
- * // 指定租户服务
41
- * request<Resp>({ url: "/api/y", method: "get", type: "tenant" })
42
- * ```
43
- * - `type` 可选,默认 `"center"`:用 BASE_URL 作为基础地址。
44
- * - `type: "tenant"`:用当前租户 `Tenant.conn.config` 作为基础地址;
45
- * "business":用当前租户 `Tenant.conn.business` 作为基础地址;
46
- * 若尚未设置租户信息(未调用 setTenant)则直接 reject。
47
- *
48
- * 返回值为响应体(已剥离 AxiosResponse 包装),类型即传入的泛型 T。
49
- *
50
- * @typeParam T 响应体 data 的类型,默认 any
51
- * @param config 请求配置,可额外携带 `type`
52
- */
53
- export default function request(config) {
54
- const { type = "center", ...rest } = config;
55
- let baseURL;
56
- switch (type) {
57
- case "center":
58
- baseURL = BASE_URL || "";
59
- break;
60
- // tenant 与 business 共用同一段租户校验,仅在最终取用的连接地址上不同
61
- case "tenant":
62
- case "business": {
63
- const tenant = getTenant();
64
- if (!tenant) {
65
- return Promise.reject(new Error(`type 为 ${type} 时,必须先调用 setTenant() 设置租户信息`));
66
- }
67
- baseURL = type === "tenant" ? tenant.conn.config : tenant.conn.business;
68
- break;
69
- }
70
- }
71
- // 用展开拷贝而非改写入参,避免副作用;同时剔除自定义的 type 字段,不泄漏给 Axios
72
- return service({ ...rest, baseURL });
73
- }
74
- //# sourceMappingURL=request.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/utils/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4C,MAAM,OAAO,CAAA;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAiB9C;;;GAGG;AACH,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,QAAQ,IAAI,EAAE;IACvB,OAAO,EAAE,KAAK;IACd,OAAO,EAAE;QACP,cAAc,EAAE,kBAAkB;KACnC;CACF,CAAC,CAAA;AAEF;;;GAGG;AACH,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAA;QACrC,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA;AAEF;;;GAGG;AACH,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAC/B,CAAC,QAAuB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CACjC,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAU,MAAqB;IAC5D,MAAM,EAAE,IAAI,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAA;IAE3C,IAAI,OAAe,CAAA;IACnB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,GAAG,QAAQ,IAAI,EAAE,CAAA;YACxB,MAAK;QACP,6CAA6C;QAC7C,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,UAAU,IAAI,6BAA6B,CAAC,CACvD,CAAA;YACH,CAAC;YACD,OAAO,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAA;YACvE,MAAK;QACP,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,OAAO,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAA0B,CAAA;AAC/D,CAAC"}