mcp-paike 1.0.5 → 1.0.8

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 CHANGED
@@ -1,141 +1,5 @@
1
- # MCP Server - 薄荷排课系统 Claude Code 接口
1
+ # mcp-paike
2
2
 
3
- 这是一个 MCP (Model Context Protocol) 服务器,让 Claude Code 可以查询排课系统的数据。
3
+ 薄荷排课系统 MCP Server
4
4
 
5
- ## 快速开始(2步完成)
6
-
7
- ### 1. 配置
8
-
9
- 编辑 `~/.claude.json`(如果文件不存在就新建),添加以下内容:
10
-
11
- ```json
12
- {
13
- "mcpServers": {
14
- "paike": {
15
- "command": "npx",
16
- "args": ["-y", "mcp-paike@latest"]
17
- }
18
- }
19
- }
20
- ```
21
-
22
- > 如果文件已有其他内容,只需添加 `mcpServers` 字段即可。
23
-
24
- <details>
25
- <summary>国内网络慢?点击设置镜像源</summary>
26
-
27
- ```bash
28
- npm config set registry https://registry.npmmirror.com
29
- ```
30
-
31
- </details>
32
-
33
- <details>
34
- <summary>其他安装方式</summary>
35
-
36
- **全局安装(启动更快):**
37
-
38
- ```bash
39
- npm install -g mcp-paike
40
- ```
41
-
42
- 配置改为:
43
-
44
- ```json
45
- {
46
- "mcpServers": {
47
- "paike": {
48
- "command": "mcp-paike"
49
- }
50
- }
51
- }
52
- ```
53
-
54
- </details>
55
-
56
- ### 2. 登录
57
-
58
- 1. 重启 Claude Code(退出后重新打开)
59
- 2. 在 Claude Code 中说:「登录排课系统」
60
- 3. 浏览器会自动打开,扫码登录即可
61
-
62
- ---
63
-
64
- ## 可用工具
65
-
66
- | 工具名 | 描述 |
67
- |--------|------|
68
- | `login` | 企业微信登录 |
69
- | `get_current_user` | 获取当前登录用户信息 |
70
- | `list_students` | 查询学员列表 |
71
- | `get_student` | 获取学员详情 |
72
- | `get_student_class` | 获取学员当前班级 |
73
- | `get_student_packages` | 获取学员课包 |
74
- | `get_student_balances` | 获取学员课次余额 |
75
- | `list_classes` | 查询班级列表 |
76
- | `get_class` | 获取班级详情 |
77
- | `get_class_students` | 获取班级学员名单 |
78
- | `list_sessions` | 查询课程排期 |
79
- | `get_session` | 获取课程详情 |
80
- | `list_attendances` | 查询考勤记录 |
81
- | `get_attendance` | 获取考勤详情 |
82
- | `list_teachers` | 获取教师列表 |
83
-
84
- ## 使用示例
85
-
86
- ```
87
- # 查询在学学员
88
- list_students(status: "ACTIVE")
89
-
90
- # 搜索学员
91
- list_students(search: "张三")
92
-
93
- # 获取学员详情
94
- get_student(studentId: "xxx-xxx-xxx")
95
-
96
- # 查询本周课程
97
- list_sessions(startDate: "2025-12-22", endDate: "2025-12-28")
98
-
99
- # 查询考勤
100
- list_attendances(sessionId: "xxx-xxx-xxx")
101
- ```
102
-
103
- ## Token 说明
104
-
105
- - Token 有效期为 **24 小时**
106
- - 过期后重新说「登录排课系统」即可
107
- - Token 保存在 `~/.config/mcp-paike/credentials.json`
108
-
109
- ## 注意事项
110
-
111
- 1. **只读接口**: 不能修改任何数据,仅提供查询功能
112
- 2. **权限控制**: 查询结果受用户权限控制(教师只能看到自己班级的学员)
113
- 3. **Token 安全**: Token 请勿分享,它代表您的身份
114
-
115
- ---
116
-
117
- ## 本地开发
118
-
119
- ```bash
120
- cd mcp-server
121
- npm install
122
- npm run build
123
- npm run dev
124
- ```
125
-
126
- 本地开发模式的配置(`~/.claude.json`):
127
-
128
- ```json
129
- {
130
- "mcpServers": {
131
- "paike": {
132
- "command": "node",
133
- "args": ["/path/to/mcp-server/dist/index.js"],
134
- "env": {
135
- "MCP_API_BASE_URL": "https://paike.bohecoding.com",
136
- "MCP_AUTH_PAGE_URL": "https://paike.bohecoding.com/mcp-auth"
137
- }
138
- }
139
- }
140
- }
141
- ```
5
+ > 仅限内部使用
package/dist/index.js CHANGED
File without changes
@@ -0,0 +1,213 @@
1
+ interface ToolResult {
2
+ content: Array<{
3
+ type: 'text';
4
+ text: string;
5
+ }>;
6
+ isError?: boolean;
7
+ }
8
+ export declare const listAchievementTypesTool: {
9
+ name: string;
10
+ description: string;
11
+ inputSchema: {
12
+ type: "object";
13
+ properties: {
14
+ category: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ isActive: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ };
24
+ required: never[];
25
+ };
26
+ handler: (args: {
27
+ category?: string;
28
+ isActive?: boolean;
29
+ }) => Promise<ToolResult>;
30
+ };
31
+ export declare const getStudentAchievementsTool: {
32
+ name: string;
33
+ description: string;
34
+ inputSchema: {
35
+ type: "object";
36
+ properties: {
37
+ studentId: {
38
+ type: string;
39
+ description: string;
40
+ };
41
+ category: {
42
+ type: string;
43
+ enum: string[];
44
+ description: string;
45
+ };
46
+ startDate: {
47
+ type: string;
48
+ description: string;
49
+ };
50
+ endDate: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ };
55
+ required: string[];
56
+ };
57
+ handler: (args: {
58
+ studentId: string;
59
+ category?: string;
60
+ startDate?: string;
61
+ endDate?: string;
62
+ }) => Promise<ToolResult>;
63
+ };
64
+ export declare const listAchievementsByTypeTool: {
65
+ name: string;
66
+ description: string;
67
+ inputSchema: {
68
+ type: "object";
69
+ properties: {
70
+ achievementTypeId: {
71
+ type: string;
72
+ description: string;
73
+ };
74
+ level: {
75
+ type: string;
76
+ description: string;
77
+ };
78
+ isPublic: {
79
+ type: string;
80
+ description: string;
81
+ };
82
+ startDate: {
83
+ type: string;
84
+ description: string;
85
+ };
86
+ endDate: {
87
+ type: string;
88
+ description: string;
89
+ };
90
+ page: {
91
+ type: string;
92
+ description: string;
93
+ };
94
+ pageSize: {
95
+ type: string;
96
+ description: string;
97
+ };
98
+ };
99
+ required: string[];
100
+ };
101
+ handler: (args: {
102
+ achievementTypeId: string;
103
+ level?: string;
104
+ isPublic?: boolean;
105
+ startDate?: string;
106
+ endDate?: string;
107
+ page?: number;
108
+ pageSize?: number;
109
+ }) => Promise<ToolResult>;
110
+ };
111
+ export declare const achievementTools: ({
112
+ name: string;
113
+ description: string;
114
+ inputSchema: {
115
+ type: "object";
116
+ properties: {
117
+ category: {
118
+ type: string;
119
+ enum: string[];
120
+ description: string;
121
+ };
122
+ isActive: {
123
+ type: string;
124
+ description: string;
125
+ };
126
+ };
127
+ required: never[];
128
+ };
129
+ handler: (args: {
130
+ category?: string;
131
+ isActive?: boolean;
132
+ }) => Promise<ToolResult>;
133
+ } | {
134
+ name: string;
135
+ description: string;
136
+ inputSchema: {
137
+ type: "object";
138
+ properties: {
139
+ studentId: {
140
+ type: string;
141
+ description: string;
142
+ };
143
+ category: {
144
+ type: string;
145
+ enum: string[];
146
+ description: string;
147
+ };
148
+ startDate: {
149
+ type: string;
150
+ description: string;
151
+ };
152
+ endDate: {
153
+ type: string;
154
+ description: string;
155
+ };
156
+ };
157
+ required: string[];
158
+ };
159
+ handler: (args: {
160
+ studentId: string;
161
+ category?: string;
162
+ startDate?: string;
163
+ endDate?: string;
164
+ }) => Promise<ToolResult>;
165
+ } | {
166
+ name: string;
167
+ description: string;
168
+ inputSchema: {
169
+ type: "object";
170
+ properties: {
171
+ achievementTypeId: {
172
+ type: string;
173
+ description: string;
174
+ };
175
+ level: {
176
+ type: string;
177
+ description: string;
178
+ };
179
+ isPublic: {
180
+ type: string;
181
+ description: string;
182
+ };
183
+ startDate: {
184
+ type: string;
185
+ description: string;
186
+ };
187
+ endDate: {
188
+ type: string;
189
+ description: string;
190
+ };
191
+ page: {
192
+ type: string;
193
+ description: string;
194
+ };
195
+ pageSize: {
196
+ type: string;
197
+ description: string;
198
+ };
199
+ };
200
+ required: string[];
201
+ };
202
+ handler: (args: {
203
+ achievementTypeId: string;
204
+ level?: string;
205
+ isPublic?: boolean;
206
+ startDate?: string;
207
+ endDate?: string;
208
+ page?: number;
209
+ pageSize?: number;
210
+ }) => Promise<ToolResult>;
211
+ })[];
212
+ export {};
213
+ //# sourceMappingURL=achievements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.d.ts","sourceRoot":"","sources":["../../src/tools/achievements.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAYD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;oBAmBb;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAG,OAAO,CAAC,UAAU,CAAC;CAwDxB,CAAC;AAGF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;oBA2Bf;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAG,OAAO,CAAC,UAAU,CAAC;CAqExB,CAAC;AAGF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAqCf;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAG,OAAO,CAAC,UAAU,CAAC;CAgGxB,CAAC;AASF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;oBA5TL;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,KAAG,OAAO,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAsFD;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAG,OAAO,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBA6GD;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,KAAG,OAAO,CAAC,UAAU,CAAC;IA6GxB,CAAC"}
@@ -0,0 +1,302 @@
1
+ import { apiClient } from '../api/client.js';
2
+ import { logger } from '../utils/logger.js';
3
+ // Category label mapping (matches backend constants)
4
+ const CATEGORY_LABELS = {
5
+ COMPETITION: '竞赛类',
6
+ CERTIFICATION: '考级类',
7
+ COURSE: '课程类',
8
+ PROJECT: '项目类',
9
+ OTHER: '其他',
10
+ };
11
+ // List achievement types
12
+ export const listAchievementTypesTool = {
13
+ name: 'list_achievement_types',
14
+ description: '获取成就类型列表 - 查看系统中所有可用的成就类型(用于筛选参考)',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ category: {
19
+ type: 'string',
20
+ enum: ['COMPETITION', 'CERTIFICATION', 'COURSE', 'PROJECT', 'OTHER'],
21
+ description: '成就大类筛选: COMPETITION(竞赛类), CERTIFICATION(考级类), COURSE(课程类), PROJECT(项目类), OTHER(其他)',
22
+ },
23
+ isActive: {
24
+ type: 'boolean',
25
+ description: '是否只显示启用的类型,默认true',
26
+ },
27
+ },
28
+ required: [],
29
+ },
30
+ handler: async (args) => {
31
+ try {
32
+ logger.debug('获取成就类型列表', args);
33
+ const params = {
34
+ isActive: args.isActive !== false, // Default to true
35
+ };
36
+ if (args.category)
37
+ params.category = args.category;
38
+ const types = await apiClient.get('/api/achievement-types', params);
39
+ if (!types || types.length === 0) {
40
+ return {
41
+ content: [{ type: 'text', text: '暂无成就类型' }],
42
+ };
43
+ }
44
+ // Group by category
45
+ const grouped = {};
46
+ for (const t of types) {
47
+ const cat = t.category || 'OTHER';
48
+ if (!grouped[cat])
49
+ grouped[cat] = [];
50
+ grouped[cat].push(t);
51
+ }
52
+ let output = '成就类型列表\n==================================\n';
53
+ for (const [category, items] of Object.entries(grouped)) {
54
+ output += `\n【${CATEGORY_LABELS[category] || category}】\n`;
55
+ for (const t of items) {
56
+ output += `\n${t.name} [ID: ${t.id}]\n`;
57
+ if (t.levels && t.levels.length > 0) {
58
+ output += ` 可选等级: ${t.levels.join('、')}\n`;
59
+ }
60
+ if (t.defaultIssuingOrg) {
61
+ output += ` 默认颁发机构: ${t.defaultIssuingOrg}\n`;
62
+ }
63
+ if (t._count?.achievements !== undefined) {
64
+ output += ` 已录入成就: ${t._count.achievements} 条\n`;
65
+ }
66
+ }
67
+ }
68
+ output += `\n共 ${types.length} 种成就类型`;
69
+ return {
70
+ content: [{ type: 'text', text: output }],
71
+ };
72
+ }
73
+ catch (error) {
74
+ logger.error('获取成就类型列表失败:', error.message);
75
+ return {
76
+ content: [{ type: 'text', text: `查询失败: ${error.message}` }],
77
+ isError: true,
78
+ };
79
+ }
80
+ },
81
+ };
82
+ // Get student achievements
83
+ export const getStudentAchievementsTool = {
84
+ name: 'get_student_achievements',
85
+ description: '查询学员成就记录 - 按学员ID查询,支持按大类筛选',
86
+ inputSchema: {
87
+ type: 'object',
88
+ properties: {
89
+ studentId: {
90
+ type: 'string',
91
+ description: '学员ID,必填',
92
+ },
93
+ category: {
94
+ type: 'string',
95
+ enum: ['COMPETITION', 'CERTIFICATION', 'COURSE', 'PROJECT', 'OTHER'],
96
+ description: '成就大类筛选: COMPETITION(竞赛类), CERTIFICATION(考级类), COURSE(课程类), PROJECT(项目类), OTHER(其他)',
97
+ },
98
+ startDate: {
99
+ type: 'string',
100
+ description: '开始日期 (YYYY-MM-DD)',
101
+ },
102
+ endDate: {
103
+ type: 'string',
104
+ description: '结束日期 (YYYY-MM-DD)',
105
+ },
106
+ },
107
+ required: ['studentId'],
108
+ },
109
+ handler: async (args) => {
110
+ try {
111
+ logger.debug('查询学员成就', args);
112
+ const params = {
113
+ studentId: args.studentId,
114
+ };
115
+ if (args.category)
116
+ params.category = args.category;
117
+ if (args.startDate)
118
+ params.startDate = args.startDate;
119
+ if (args.endDate)
120
+ params.endDate = args.endDate;
121
+ const result = await apiClient.get('/api/student-achievements', params);
122
+ const achievements = result.achievements || [];
123
+ if (achievements.length === 0) {
124
+ return {
125
+ content: [{ type: 'text', text: '该学员暂无成就记录' }],
126
+ };
127
+ }
128
+ // Get student name from first achievement
129
+ const studentName = achievements[0]?.student?.name || '未知学员';
130
+ let output = `学员成就记录\n==================================\n`;
131
+ output += `学员: ${studentName}\n`;
132
+ output += `成就数量: ${result.pagination?.total || achievements.length} 条\n`;
133
+ for (let i = 0; i < achievements.length; i++) {
134
+ const a = achievements[i];
135
+ const categoryLabel = CATEGORY_LABELS[a.achievementType?.category] || a.achievementType?.category || '';
136
+ output += `\n${i + 1}. ${a.title} [${categoryLabel}]\n`;
137
+ output += ` 类型: ${a.achievementType?.name || '-'}`;
138
+ if (a.level) {
139
+ output += ` | 等级: ${a.level}`;
140
+ }
141
+ output += `\n`;
142
+ output += ` 获得日期: ${formatDate(a.achievedAt)}\n`;
143
+ if (a.issuingOrg) {
144
+ output += ` 颁发机构: ${a.issuingOrg}\n`;
145
+ }
146
+ output += ` 可用于宣传: ${a.isPublic ? '是' : '否'}\n`;
147
+ if (a.attachments && a.attachments.length > 0) {
148
+ output += ` 附件: ${a.attachments.length}个\n`;
149
+ }
150
+ }
151
+ return {
152
+ content: [{ type: 'text', text: output }],
153
+ };
154
+ }
155
+ catch (error) {
156
+ logger.error('查询学员成就失败:', error.message);
157
+ if (error.message?.includes('404')) {
158
+ return {
159
+ content: [{ type: 'text', text: '未找到学员,请检查学员ID是否正确' }],
160
+ isError: true,
161
+ };
162
+ }
163
+ return {
164
+ content: [{ type: 'text', text: `查询失败: ${error.message}` }],
165
+ isError: true,
166
+ };
167
+ }
168
+ },
169
+ };
170
+ // List achievements by type
171
+ export const listAchievementsByTypeTool = {
172
+ name: 'list_achievements_by_type',
173
+ description: '按成就类型查询获奖学员 - 查看特定成就类型下的所有获奖记录',
174
+ inputSchema: {
175
+ type: 'object',
176
+ properties: {
177
+ achievementTypeId: {
178
+ type: 'string',
179
+ description: '成就类型ID,必填',
180
+ },
181
+ level: {
182
+ type: 'string',
183
+ description: '获奖等级筛选(如: 一等奖、二等奖)',
184
+ },
185
+ isPublic: {
186
+ type: 'boolean',
187
+ description: '是否只显示可用于宣传的记录',
188
+ },
189
+ startDate: {
190
+ type: 'string',
191
+ description: '开始日期 (YYYY-MM-DD)',
192
+ },
193
+ endDate: {
194
+ type: 'string',
195
+ description: '结束日期 (YYYY-MM-DD)',
196
+ },
197
+ page: {
198
+ type: 'number',
199
+ description: '页码,默认1',
200
+ },
201
+ pageSize: {
202
+ type: 'number',
203
+ description: '每页数量,默认20',
204
+ },
205
+ },
206
+ required: ['achievementTypeId'],
207
+ },
208
+ handler: async (args) => {
209
+ try {
210
+ logger.debug('按成就类型查询获奖记录', args);
211
+ const params = {
212
+ achievementTypeId: args.achievementTypeId,
213
+ page: Math.max(1, args.page || 1),
214
+ pageSize: Math.min(100, Math.max(1, args.pageSize || 20)),
215
+ };
216
+ if (args.level)
217
+ params.level = args.level;
218
+ if (args.isPublic !== undefined)
219
+ params.isPublic = args.isPublic;
220
+ if (args.startDate)
221
+ params.startDate = args.startDate;
222
+ if (args.endDate)
223
+ params.endDate = args.endDate;
224
+ const result = await apiClient.get('/api/student-achievements', params);
225
+ const achievements = result.achievements || [];
226
+ if (achievements.length === 0) {
227
+ return {
228
+ content: [
229
+ {
230
+ type: 'text',
231
+ text: '该成就类型下暂无获奖记录\n\n提示: 请使用 list_achievement_types 查看可用的成就类型',
232
+ },
233
+ ],
234
+ };
235
+ }
236
+ // Get achievement type info from first record
237
+ const typeInfo = achievements[0]?.achievementType;
238
+ const typeName = typeInfo?.name || '未知类型';
239
+ const categoryLabel = CATEGORY_LABELS[typeInfo?.category] || typeInfo?.category || '';
240
+ let output = `成就类型获奖记录: ${typeName}\n==================================\n`;
241
+ output += `类别: ${categoryLabel}\n`;
242
+ if (typeInfo?.levels && typeInfo.levels.length > 0) {
243
+ output += `可选等级: ${typeInfo.levels.join('、')}\n`;
244
+ }
245
+ output += `共 ${result.pagination.total} 条记录 (第 ${result.pagination.page}/${result.pagination.totalPages} 页)\n`;
246
+ // Count by level
247
+ const levelCounts = {};
248
+ for (let i = 0; i < achievements.length; i++) {
249
+ const a = achievements[i];
250
+ const studentName = a.student?.name || '未知学员';
251
+ output += `\n${i + 1}. ${studentName} - ${a.title}\n`;
252
+ output += ` 等级: ${a.level || '-'} | 获得日期: ${formatDate(a.achievedAt)}\n`;
253
+ output += ` 可宣传: ${a.isPublic ? '是' : '否'}\n`;
254
+ // Count levels
255
+ if (a.level) {
256
+ levelCounts[a.level] = (levelCounts[a.level] || 0) + 1;
257
+ }
258
+ }
259
+ // Show level statistics if there are multiple levels
260
+ if (Object.keys(levelCounts).length > 0) {
261
+ output += '\n';
262
+ output += Object.entries(levelCounts)
263
+ .map(([level, count]) => `${level}: ${count}人`)
264
+ .join(' | ');
265
+ }
266
+ return {
267
+ content: [{ type: 'text', text: output }],
268
+ };
269
+ }
270
+ catch (error) {
271
+ logger.error('按成就类型查询失败:', error.message);
272
+ if (error.message?.includes('404')) {
273
+ return {
274
+ content: [
275
+ {
276
+ type: 'text',
277
+ text: '未找到该成就类型,请使用 list_achievement_types 查看可用类型',
278
+ },
279
+ ],
280
+ isError: true,
281
+ };
282
+ }
283
+ return {
284
+ content: [{ type: 'text', text: `查询失败: ${error.message}` }],
285
+ isError: true,
286
+ };
287
+ }
288
+ },
289
+ };
290
+ // Helper function
291
+ function formatDate(dateStr) {
292
+ if (!dateStr)
293
+ return '-';
294
+ return new Date(dateStr).toLocaleDateString('zh-CN');
295
+ }
296
+ // Export all achievement tools
297
+ export const achievementTools = [
298
+ listAchievementTypesTool,
299
+ getStudentAchievementsTool,
300
+ listAchievementsByTypeTool,
301
+ ];
302
+ //# sourceMappingURL=achievements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"achievements.js","sourceRoot":"","sources":["../../src/tools/achievements.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAYD,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAAgC;;IAQ7C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC,WAAW,IAAI,IAAI,EAAE;IAIrB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE;IAchD,YAAY,IAAI,MAAM,EAAE;CAGzB;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC;AAC/C,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAQA,UAAU,UAAU;IAClB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,IAAI;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;IACF,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAaD,cAAM,YAAY;IAChB,OAAO,CAAC,KAAK,CAAgC;;IAQ7C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIvC,WAAW,IAAI,IAAI,EAAE;IAIrB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE;IAchD,YAAY,IAAI,MAAM,EAAE;CAGzB;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC;AAC/C,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC"}
@@ -4,6 +4,7 @@ import { classTools } from './classes.js';
4
4
  import { sessionTools } from './sessions.js';
5
5
  import { attendanceTools } from './attendances.js';
6
6
  import { financeTools } from './finance.js';
7
+ import { achievementTools } from './achievements.js';
7
8
  // Combine all tools
8
9
  const allTools = [
9
10
  ...authTools,
@@ -12,6 +13,7 @@ const allTools = [
12
13
  ...sessionTools,
13
14
  ...attendanceTools,
14
15
  ...financeTools,
16
+ ...achievementTools,
15
17
  ];
16
18
  class ToolRegistry {
17
19
  tools = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAmB5C,oBAAoB;AACpB,MAAM,QAAQ,GAAW;IACvB,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,eAAe;IAClB,GAAG,YAAY;CAChB,CAAC;AAEF,MAAM,YAAY;IACR,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAC;IAE7C;QACE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,QAAuB;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACrD,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAC;YAEpC,+CAA+C;YAC/C,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBAClC,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,aAAa,CAAC;YAC5D,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAmBrD,oBAAoB;AACpB,MAAM,QAAQ,GAAW;IACvB,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,eAAe;IAClB,GAAG,YAAY;IACf,GAAG,gBAAgB;CACpB,CAAC;AAEF,MAAM,YAAY;IACR,KAAK,GAAsB,IAAI,GAAG,EAAE,CAAC;IAE7C;QACE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,eAAe,CAAC,QAAuB;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACrD,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,OAAO,IAAI,CAAC;YAEpC,+CAA+C;YAC/C,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;gBAClC,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,aAAa,CAAC;YAC5D,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-paike",
3
- "version": "1.0.5",
3
+ "version": "1.0.8",
4
4
  "description": "MCP Server for Children's Coding Training Scheduling System - 少儿编程培训排课系统 Claude Code 接口",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -50,7 +50,7 @@
50
50
  "license": "GPL-3.0-only",
51
51
  "repository": {
52
52
  "type": "git",
53
- "url": "https://github.com/huangbow/mint_coding_management_system.git",
53
+ "url": "git+https://github.com/huangbow/mint_coding_management_system.git",
54
54
  "directory": "mcp-server"
55
55
  },
56
56
  "homepage": "https://github.com/huangbow/mint_coding_management_system/tree/main/mcp-server"
@@ -1,2 +0,0 @@
1
- export default function open(target: string): Promise<void>;
2
- //# sourceMappingURL=open.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/open.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1D"}
@@ -1,5 +0,0 @@
1
- // Mock for the 'open' package
2
- export default function open(target) {
3
- return Promise.resolve();
4
- }
5
- //# sourceMappingURL=open.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/open.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,MAAc;IACzC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=toolRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/toolRegistry.test.ts"],"names":[],"mappings":""}
@@ -1,352 +0,0 @@
1
- // Unit tests for role-based tool filtering logic
2
- // Testing the filtering algorithm directly without importing heavy dependencies
3
- // Extract the filtering logic for testing
4
- function getToolsForRole(tools, userRole) {
5
- return tools.filter((tool) => {
6
- // No role requirement = available to all authenticated users
7
- if (!tool.requiredRole)
8
- return true;
9
- // ADMIN requirement: Only ADMIN or SUPER_ADMIN
10
- if (tool.requiredRole === 'ADMIN') {
11
- return userRole === 'ADMIN' || userRole === 'SUPER_ADMIN';
12
- }
13
- return false;
14
- });
15
- }
16
- describe('Role-based tool filtering', () => {
17
- // Mock tools for testing
18
- const mockTools = [
19
- {
20
- name: 'login',
21
- description: 'Login tool',
22
- inputSchema: { type: 'object', properties: {}, required: [] },
23
- handler: async () => ({ content: [] }),
24
- },
25
- {
26
- name: 'get_teacher_sales',
27
- description: 'Teacher sales tool (all users)',
28
- inputSchema: { type: 'object', properties: {}, required: [] },
29
- handler: async () => ({ content: [] }),
30
- },
31
- {
32
- name: 'get_student_balance_detail',
33
- description: 'Student balance tool (all users)',
34
- inputSchema: { type: 'object', properties: {}, required: [] },
35
- handler: async () => ({ content: [] }),
36
- },
37
- {
38
- name: 'get_session_fee_rules',
39
- description: 'Session fee rules (admin only)',
40
- inputSchema: { type: 'object', properties: {}, required: [] },
41
- handler: async () => ({ content: [] }),
42
- requiredRole: 'ADMIN',
43
- },
44
- ];
45
- describe('getToolsForRole', () => {
46
- it('should hide admin-only tools from STAFF users', () => {
47
- const tools = getToolsForRole(mockTools, 'STAFF');
48
- const toolNames = tools.map((t) => t.name);
49
- expect(toolNames).not.toContain('get_session_fee_rules');
50
- expect(toolNames).toContain('get_teacher_sales');
51
- expect(toolNames).toContain('get_student_balance_detail');
52
- expect(toolNames).toContain('login');
53
- expect(tools.length).toBe(3);
54
- });
55
- it('should show admin-only tools to ADMIN users', () => {
56
- const tools = getToolsForRole(mockTools, 'ADMIN');
57
- const toolNames = tools.map((t) => t.name);
58
- expect(toolNames).toContain('get_session_fee_rules');
59
- expect(toolNames).toContain('get_teacher_sales');
60
- expect(toolNames).toContain('get_student_balance_detail');
61
- expect(tools.length).toBe(4);
62
- });
63
- it('should show admin-only tools to SUPER_ADMIN users', () => {
64
- const tools = getToolsForRole(mockTools, 'SUPER_ADMIN');
65
- const toolNames = tools.map((t) => t.name);
66
- expect(toolNames).toContain('get_session_fee_rules');
67
- expect(tools.length).toBe(4);
68
- });
69
- it('should hide admin-only tools when user is null (not authenticated)', () => {
70
- const tools = getToolsForRole(mockTools, null);
71
- const toolNames = tools.map((t) => t.name);
72
- expect(toolNames).not.toContain('get_session_fee_rules');
73
- expect(toolNames).toContain('login');
74
- expect(tools.length).toBe(3);
75
- });
76
- it('should handle empty tools array', () => {
77
- const tools = getToolsForRole([], 'ADMIN');
78
- expect(tools.length).toBe(0);
79
- });
80
- it('should handle unknown role by hiding admin tools', () => {
81
- const tools = getToolsForRole(mockTools, 'UNKNOWN_ROLE');
82
- const toolNames = tools.map((t) => t.name);
83
- expect(toolNames).not.toContain('get_session_fee_rules');
84
- });
85
- });
86
- describe('Tool configuration validation', () => {
87
- it('admin-only tools should have requiredRole set to ADMIN', () => {
88
- const adminTool = mockTools.find((t) => t.name === 'get_session_fee_rules');
89
- expect(adminTool?.requiredRole).toBe('ADMIN');
90
- });
91
- it('regular tools should not have requiredRole set', () => {
92
- const regularTool = mockTools.find((t) => t.name === 'get_teacher_sales');
93
- expect(regularTool?.requiredRole).toBeUndefined();
94
- });
95
- });
96
- });
97
- describe('STAFF data isolation for get_teacher_sales', () => {
98
- // Test the permission logic for STAFF users
99
- function canStaffAccessTeacherData(userRole, userId, requestedTeacherId) {
100
- const isAdmin = userRole === 'ADMIN' || userRole === 'SUPER_ADMIN';
101
- if (!isAdmin) {
102
- // STAFF can only query their own data
103
- if (requestedTeacherId && requestedTeacherId !== userId) {
104
- return { allowed: false, reason: 'STAFF can only query own data' };
105
- }
106
- }
107
- return { allowed: true };
108
- }
109
- it('STAFF should be able to query their own data', () => {
110
- const result = canStaffAccessTeacherData('STAFF', 'user-123', 'user-123');
111
- expect(result.allowed).toBe(true);
112
- });
113
- it('STAFF should NOT be able to query other teachers data', () => {
114
- const result = canStaffAccessTeacherData('STAFF', 'user-123', 'other-user-456');
115
- expect(result.allowed).toBe(false);
116
- expect(result.reason).toBe('STAFF can only query own data');
117
- });
118
- it('STAFF should be able to query without specifying teacherId (defaults to self)', () => {
119
- const result = canStaffAccessTeacherData('STAFF', 'user-123', undefined);
120
- expect(result.allowed).toBe(true);
121
- });
122
- it('ADMIN should be able to query any teacher data', () => {
123
- const result = canStaffAccessTeacherData('ADMIN', 'admin-user', 'other-teacher-789');
124
- expect(result.allowed).toBe(true);
125
- });
126
- it('SUPER_ADMIN should be able to query any teacher data', () => {
127
- const result = canStaffAccessTeacherData('SUPER_ADMIN', 'super-admin', 'any-teacher');
128
- expect(result.allowed).toBe(true);
129
- });
130
- });
131
- describe('Class ID resolution', () => {
132
- // Test the logic for resolving class ID from UUID, classNumber, or class name
133
- function isUUID(str) {
134
- return str.includes('-') && str.length > 30;
135
- }
136
- function findClassBySearch(classes, search) {
137
- if (classes.length === 0)
138
- return null;
139
- // Try exact match on classNumber or name first
140
- const exactMatch = classes.find((c) => c.classNumber === search || c.name === search);
141
- return exactMatch?.id || classes[0].id;
142
- }
143
- const mockClasses = [
144
- { id: '7c086f5f-9ee4-49e4-be6b-50b596dc01f3', classNumber: 'S1-007', name: 'S33' },
145
- { id: '70e37219-84cf-465f-a7d8-4c70623cfc7a', classNumber: 'Z5-004', name: 'C11' },
146
- { id: 'd12553ef-2570-4f77-a823-764804f6d29f', classNumber: 'S1-009', name: 'S37' },
147
- ];
148
- describe('isUUID', () => {
149
- it('should identify valid UUIDs', () => {
150
- expect(isUUID('7c086f5f-9ee4-49e4-be6b-50b596dc01f3')).toBe(true);
151
- expect(isUUID('d0b05059-2a5b-405c-bb75-a3748bfbc7be')).toBe(true);
152
- });
153
- it('should reject classNumbers', () => {
154
- expect(isUUID('S1-007')).toBe(false);
155
- expect(isUUID('Z5-004')).toBe(false);
156
- });
157
- it('should reject class names', () => {
158
- expect(isUUID('S33')).toBe(false);
159
- expect(isUUID('C11')).toBe(false);
160
- });
161
- });
162
- describe('findClassBySearch', () => {
163
- it('should find class by exact classNumber match', () => {
164
- const result = findClassBySearch(mockClasses, 'S1-007');
165
- expect(result).toBe('7c086f5f-9ee4-49e4-be6b-50b596dc01f3');
166
- });
167
- it('should find class by exact name match', () => {
168
- const result = findClassBySearch(mockClasses, 'S33');
169
- expect(result).toBe('7c086f5f-9ee4-49e4-be6b-50b596dc01f3');
170
- });
171
- it('should find class by name C11', () => {
172
- const result = findClassBySearch(mockClasses, 'C11');
173
- expect(result).toBe('70e37219-84cf-465f-a7d8-4c70623cfc7a');
174
- });
175
- it('should return first result when no exact match', () => {
176
- const result = findClassBySearch(mockClasses, 'partial');
177
- expect(result).toBe('7c086f5f-9ee4-49e4-be6b-50b596dc01f3');
178
- });
179
- it('should return null for empty array', () => {
180
- const result = findClassBySearch([], 'S33');
181
- expect(result).toBeNull();
182
- });
183
- });
184
- });
185
- describe('Session participant resolution', () => {
186
- // Test the logic for determining participants from class.students or session.participants
187
- function getParticipants(session) {
188
- if (session.class?.students && session.class.students.length > 0) {
189
- return { list: session.class.students, source: 'class.students' };
190
- }
191
- else if (session.participants && session.participants.length > 0) {
192
- return { list: session.participants, source: 'participants' };
193
- }
194
- return { list: [], source: 'none' };
195
- }
196
- it('should use class.students for class-based sessions', () => {
197
- const session = {
198
- class: {
199
- students: [
200
- { name: '蔡昕昊', studentType: 'FORMAL' },
201
- { name: '黄煊懿', studentType: 'FORMAL' },
202
- ],
203
- },
204
- participants: [],
205
- };
206
- const result = getParticipants(session);
207
- expect(result.source).toBe('class.students');
208
- expect(result.list.length).toBe(2);
209
- });
210
- it('should use participants for on-demand sessions', () => {
211
- const session = {
212
- participants: [
213
- { student: { name: '张三', studentType: 'FORMAL' }, participationType: 'FORMAL' },
214
- ],
215
- };
216
- const result = getParticipants(session);
217
- expect(result.source).toBe('participants');
218
- expect(result.list.length).toBe(1);
219
- });
220
- it('should return empty for sessions with no participants', () => {
221
- const session = {
222
- class: { students: [] },
223
- participants: [],
224
- };
225
- const result = getParticipants(session);
226
- expect(result.source).toBe('none');
227
- expect(result.list.length).toBe(0);
228
- });
229
- it('should prefer class.students over participants when both exist', () => {
230
- const session = {
231
- class: {
232
- students: [{ name: '李四', studentType: 'FORMAL' }],
233
- },
234
- participants: [
235
- { student: { name: '王五', studentType: 'FORMAL' }, participationType: 'FORMAL' },
236
- ],
237
- };
238
- const result = getParticipants(session);
239
- expect(result.source).toBe('class.students');
240
- });
241
- });
242
- describe('Attendance API response parsing', () => {
243
- // Test the attendance response structure (flat pagination fields)
244
- function parseAttendanceResponse(result) {
245
- const totalPages = Math.ceil(result.total / result.pageSize) || 1;
246
- return {
247
- attendances: result.attendances.map((a) => ({
248
- id: a.id,
249
- studentName: a.student?.name,
250
- className: a.session?.class?.name || '临时课程',
251
- status: a.status,
252
- })),
253
- total: result.total,
254
- page: result.page,
255
- totalPages,
256
- };
257
- }
258
- it('should correctly parse attendance response with attendances array', () => {
259
- const response = {
260
- attendances: [
261
- {
262
- id: 'att-1',
263
- student: { name: '张三' },
264
- session: { startTime: '2025-12-01T10:00:00Z', class: { name: 'S33' } },
265
- status: 'PRESENT',
266
- sessionsDeducted: 1,
267
- deductionType: 'PURCHASED',
268
- },
269
- ],
270
- total: 1,
271
- page: 1,
272
- pageSize: 20,
273
- };
274
- const result = parseAttendanceResponse(response);
275
- expect(result.attendances.length).toBe(1);
276
- expect(result.attendances[0].studentName).toBe('张三');
277
- expect(result.attendances[0].className).toBe('S33');
278
- expect(result.total).toBe(1);
279
- expect(result.totalPages).toBe(1);
280
- });
281
- it('should handle empty attendances array', () => {
282
- const response = {
283
- attendances: [],
284
- total: 0,
285
- page: 1,
286
- pageSize: 20,
287
- };
288
- const result = parseAttendanceResponse(response);
289
- expect(result.attendances.length).toBe(0);
290
- expect(result.total).toBe(0);
291
- expect(result.totalPages).toBe(1); // At least 1 page even if empty
292
- });
293
- it('should handle on-demand sessions without class', () => {
294
- const response = {
295
- attendances: [
296
- {
297
- id: 'att-2',
298
- student: { name: '李四' },
299
- session: { startTime: '2025-12-01T10:00:00Z' },
300
- status: 'PRESENT',
301
- sessionsDeducted: 1,
302
- deductionType: 'PURCHASED',
303
- },
304
- ],
305
- total: 1,
306
- page: 1,
307
- pageSize: 20,
308
- };
309
- const result = parseAttendanceResponse(response);
310
- expect(result.attendances[0].className).toBe('临时课程');
311
- });
312
- it('should calculate totalPages correctly', () => {
313
- const response = {
314
- attendances: [],
315
- total: 55,
316
- page: 1,
317
- pageSize: 20,
318
- };
319
- const result = parseAttendanceResponse(response);
320
- expect(result.totalPages).toBe(3); // 55 / 20 = 2.75 -> ceil = 3
321
- });
322
- });
323
- describe('Currency parsing', () => {
324
- // Test the fixed currency parsing logic
325
- function parseCurrency(value) {
326
- return parseFloat((value || '¥0').replace('¥', '').replace(/,/g, '')) || 0;
327
- }
328
- it('should parse simple currency values', () => {
329
- expect(parseCurrency('¥123.45')).toBe(123.45);
330
- });
331
- it('should parse values with thousands separator', () => {
332
- expect(parseCurrency('¥12,345.67')).toBe(12345.67);
333
- });
334
- it('should parse values with multiple commas', () => {
335
- expect(parseCurrency('¥1,234,567.89')).toBe(1234567.89);
336
- });
337
- it('should handle null values', () => {
338
- expect(parseCurrency(null)).toBe(0);
339
- });
340
- it('should handle undefined values', () => {
341
- expect(parseCurrency(undefined)).toBe(0);
342
- });
343
- it('should handle values without currency symbol', () => {
344
- expect(parseCurrency('1,234.56')).toBe(1234.56);
345
- });
346
- it('should handle zero values', () => {
347
- expect(parseCurrency('¥0')).toBe(0);
348
- expect(parseCurrency('¥0.00')).toBe(0);
349
- });
350
- });
351
- export {};
352
- //# sourceMappingURL=toolRegistry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toolRegistry.test.js","sourceRoot":"","sources":["../../src/__tests__/toolRegistry.test.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,gFAAgF;AAchF,0CAA0C;AAC1C,SAAS,eAAe,CAAC,KAAa,EAAE,QAAuB;IAC7D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3B,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAEpC,+CAA+C;QAC/C,IAAI,IAAI,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,aAAa,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,yBAAyB;IACzB,MAAM,SAAS,GAAW;QACxB;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;SACvC;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,gCAAgC;YAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;SACvC;QACD;YACE,IAAI,EAAE,4BAA4B;YAClC,WAAW,EAAE,kCAAkC;YAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;SACvC;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,gCAAgC;YAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC7D,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YACtC,YAAY,EAAE,OAAO;SACtB;KACF,CAAC;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACrD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;YAC5E,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACzD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC,CAAC;YAC5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;YAC1E,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IAC1D,4CAA4C;IAC5C,SAAS,yBAAyB,CAChC,QAA4B,EAC5B,MAA0B,EAC1B,kBAAsC;QAEtC,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,aAAa,CAAC;QAEnE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,sCAAsC;YACtC,IAAI,kBAAkB,IAAI,kBAAkB,KAAK,MAAM,EAAE,CAAC;gBACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,yBAAyB,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACtF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,8EAA8E;IAC9E,SAAS,MAAM,CAAC,GAAW;QACzB,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAC9C,CAAC;IAED,SAAS,iBAAiB,CACxB,OAAiE,EACjE,MAAc;QAEd,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,+CAA+C;QAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CACrD,CAAC;QACF,OAAO,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,WAAW,GAAG;QAClB,EAAE,EAAE,EAAE,sCAAsC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;QAClF,EAAE,EAAE,EAAE,sCAAsC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;QAClF,EAAE,EAAE,EAAE,sCAAsC,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;KACnF,CAAC;IAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,MAAM,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5C,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,0FAA0F;IAmB1F,SAAS,eAAe,CAAC,OAAgB;QACvC,IAAI,OAAO,CAAC,KAAK,EAAE,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAChE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACtC,CAAC;IAED,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,OAAO,GAAY;YACvB,KAAK,EAAE;gBACL,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;oBACtC,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE;iBACvC;aACF;YACD,YAAY,EAAE,EAAE;SACjB,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,OAAO,GAAY;YACvB,YAAY,EAAE;gBACZ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;aAChF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,OAAO,GAAY;YACvB,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvB,YAAY,EAAE,EAAE;SACjB,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,OAAO,GAAY;YACvB,KAAK,EAAE;gBACL,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;aAClD;YACD,YAAY,EAAE;gBACZ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,EAAE,QAAQ,EAAE;aAChF;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,kEAAkE;IAgBlE,SAAS,uBAAuB,CAAC,MAA0B;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClE,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI;gBAC5B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,MAAM;gBAC3C,MAAM,EAAE,CAAC,CAAC,MAAM;aACjB,CAAC,CAAC;YACH,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,UAAU;SACX,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,QAAQ,GAAuB;YACnC,WAAW,EAAE;gBACX;oBACE,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;oBACvB,OAAO,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;oBACtE,MAAM,EAAE,SAAS;oBACjB,gBAAgB,EAAE,CAAC;oBACnB,aAAa,EAAE,WAAW;iBAC3B;aACF;YACD,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAuB;YACnC,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAuB;YACnC,WAAW,EAAE;gBACX;oBACE,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;oBACvB,OAAO,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE;oBAC9C,MAAM,EAAE,SAAS;oBACjB,gBAAgB,EAAE,CAAC;oBACnB,aAAa,EAAE,WAAW;iBAC3B;aACF;YACD,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAuB;YACnC,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,EAAE;YACT,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,wCAAwC;IACxC,SAAS,aAAa,CAAC,KAAgC;QACrD,OAAO,UAAU,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}