hydro-ai-helper 1.8.5
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/.eslintrc.json +31 -0
- package/.github/workflows/sync-releases-to-gitee.yml +119 -0
- package/.github/workflows/sync-to-gitee.yml +53 -0
- package/.vercelignore +31 -0
- package/CONTRIBUTING.md +165 -0
- package/README.md +273 -0
- package/TROUBLESHOOTING.md +355 -0
- package/api/badge-active.ts +88 -0
- package/api/badge-installs.ts +75 -0
- package/api/report.ts +242 -0
- package/assets/screenshots/1.png +0 -0
- package/assets/screenshots/2.png +0 -0
- package/assets/screenshots/3.png +0 -0
- package/assets/screenshots/4.png +0 -0
- package/assets/screenshots/5.png +0 -0
- package/assets/screenshots/6.png +0 -0
- package/assets/screenshots/7.png +0 -0
- package/dist/__tests__/__mocks__/hydrooj.js +29 -0
- package/dist/__tests__/__mocks__/hydrooj.js.map +1 -0
- package/dist/constants/jailbreakRules.js +29 -0
- package/dist/constants/jailbreakRules.js.map +1 -0
- package/dist/constants/permissions.js +42 -0
- package/dist/constants/permissions.js.map +1 -0
- package/dist/handlers/adminConfigHandler.js +347 -0
- package/dist/handlers/adminConfigHandler.js.map +1 -0
- package/dist/handlers/adminHandler.js +378 -0
- package/dist/handlers/adminHandler.js.map +1 -0
- package/dist/handlers/analyticsHandler.js +433 -0
- package/dist/handlers/analyticsHandler.js.map +1 -0
- package/dist/handlers/dashboardHandler.js +22 -0
- package/dist/handlers/dashboardHandler.js.map +1 -0
- package/dist/handlers/exportHandler.js +118 -0
- package/dist/handlers/exportHandler.js.map +1 -0
- package/dist/handlers/studentHandler.js +430 -0
- package/dist/handlers/studentHandler.js.map +1 -0
- package/dist/handlers/teacherHandler.js +246 -0
- package/dist/handlers/teacherHandler.js.map +1 -0
- package/dist/handlers/testHandler.js +27 -0
- package/dist/handlers/testHandler.js.map +1 -0
- package/dist/handlers/updateHandler.js +84 -0
- package/dist/handlers/updateHandler.js.map +1 -0
- package/dist/handlers/versionHandler.js +61 -0
- package/dist/handlers/versionHandler.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +151 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/crypto.js +110 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/httpHelpers.js +61 -0
- package/dist/lib/httpHelpers.js.map +1 -0
- package/dist/lib/queryHelpers.js +81 -0
- package/dist/lib/queryHelpers.js.map +1 -0
- package/dist/models/aiConfig.js +255 -0
- package/dist/models/aiConfig.js.map +1 -0
- package/dist/models/conversation.js +209 -0
- package/dist/models/conversation.js.map +1 -0
- package/dist/models/jailbreakLog.js +68 -0
- package/dist/models/jailbreakLog.js.map +1 -0
- package/dist/models/message.js +174 -0
- package/dist/models/message.js.map +1 -0
- package/dist/models/pluginInstall.js +95 -0
- package/dist/models/pluginInstall.js.map +1 -0
- package/dist/models/rateLimitRecord.js +54 -0
- package/dist/models/rateLimitRecord.js.map +1 -0
- package/dist/models/versionCache.js +89 -0
- package/dist/models/versionCache.js.map +1 -0
- package/dist/services/effectivenessService.js +131 -0
- package/dist/services/effectivenessService.js.map +1 -0
- package/dist/services/exportService.js +152 -0
- package/dist/services/exportService.js.map +1 -0
- package/dist/services/migrationService.js +90 -0
- package/dist/services/migrationService.js.map +1 -0
- package/dist/services/openaiClient.js +412 -0
- package/dist/services/openaiClient.js.map +1 -0
- package/dist/services/promptService.js +467 -0
- package/dist/services/promptService.js.map +1 -0
- package/dist/services/rateLimitService.js +108 -0
- package/dist/services/rateLimitService.js.map +1 -0
- package/dist/services/telemetryService.js +173 -0
- package/dist/services/telemetryService.js.map +1 -0
- package/dist/services/updateService.js +388 -0
- package/dist/services/updateService.js.map +1 -0
- package/dist/services/versionService.js +289 -0
- package/dist/services/versionService.js.map +1 -0
- package/dist/types/hydrooj.js +7 -0
- package/dist/types/hydrooj.js.map +1 -0
- package/dist/types/mongo.js +7 -0
- package/dist/types/mongo.js.map +1 -0
- package/dist/utils/domainHelper.js +16 -0
- package/dist/utils/domainHelper.js.map +1 -0
- package/dist/utils/mongo.js +16 -0
- package/dist/utils/mongo.js.map +1 -0
- package/frontend/admin/ConfigPanel.tsx +1379 -0
- package/frontend/admin/VersionBadge.tsx +655 -0
- package/frontend/ai_helper.page.tsx +52 -0
- package/frontend/ai_helper_admin_config.page.tsx +47 -0
- package/frontend/ai_helper_analytics.page.tsx +52 -0
- package/frontend/ai_helper_conversation_detail.page.tsx +55 -0
- package/frontend/ai_helper_conversations.page.tsx +56 -0
- package/frontend/components/AIHelperDashboard.tsx +125 -0
- package/frontend/problem_detail.page.tsx +395 -0
- package/frontend/student/AIAssistantPanel.tsx +1839 -0
- package/frontend/student/AIChatPanel.tsx +944 -0
- package/frontend/student/ThreeColumnLayout.tsx +240 -0
- package/frontend/teacher/AnalyticsPage.tsx +614 -0
- package/frontend/teacher/ConversationDetail.tsx +504 -0
- package/frontend/teacher/ConversationList.tsx +568 -0
- package/frontend/teacher/ExportDialog.tsx +291 -0
- package/frontend/test.page.ts +88 -0
- package/frontend/utils/domainUtils.ts +37 -0
- package/index.js +6 -0
- package/jest.config.js +17 -0
- package/lib/mongodb.ts +60 -0
- package/locales/en.yaml +4 -0
- package/locales/zh.yaml +77 -0
- package/package.json +48 -0
- package/public/.gitkeep +0 -0
- package/public/README.md +1 -0
- package/src/__tests__/__mocks__/hydrooj.ts +27 -0
- package/src/__tests__/services/exportService.test.ts +156 -0
- package/src/__tests__/services/promptService.test.ts +141 -0
- package/src/__tests__/services/rateLimitService.test.ts +145 -0
- package/src/__tests__/utils/domainHelper.test.ts +47 -0
- package/src/constants/jailbreakRules.ts +28 -0
- package/src/constants/permissions.ts +43 -0
- package/src/handlers/adminConfigHandler.ts +363 -0
- package/src/handlers/adminHandler.ts +427 -0
- package/src/handlers/analyticsHandler.ts +517 -0
- package/src/handlers/dashboardHandler.ts +20 -0
- package/src/handlers/exportHandler.ts +134 -0
- package/src/handlers/studentHandler.ts +483 -0
- package/src/handlers/teacherHandler.ts +317 -0
- package/src/handlers/testHandler.ts +25 -0
- package/src/handlers/updateHandler.ts +85 -0
- package/src/handlers/versionHandler.ts +62 -0
- package/src/index.ts +198 -0
- package/src/lib/crypto.ts +125 -0
- package/src/lib/httpHelpers.ts +75 -0
- package/src/lib/queryHelpers.ts +108 -0
- package/src/models/aiConfig.ts +375 -0
- package/src/models/conversation.ts +328 -0
- package/src/models/jailbreakLog.ts +108 -0
- package/src/models/message.ts +246 -0
- package/src/models/pluginInstall.ts +138 -0
- package/src/models/rateLimitRecord.ts +81 -0
- package/src/models/versionCache.ts +127 -0
- package/src/services/effectivenessService.ts +161 -0
- package/src/services/exportService.ts +191 -0
- package/src/services/migrationService.ts +111 -0
- package/src/services/openaiClient.ts +548 -0
- package/src/services/promptService.ts +573 -0
- package/src/services/rateLimitService.ts +122 -0
- package/src/services/telemetryService.ts +218 -0
- package/src/services/updateService.ts +441 -0
- package/src/services/versionService.ts +351 -0
- package/src/types/hydrooj-extensions.d.ts +55 -0
- package/src/types/hydrooj.ts +38 -0
- package/src/types/mongo.ts +23 -0
- package/src/utils/domainHelper.ts +16 -0
- package/src/utils/mongo.ts +15 -0
- package/templates/ai-helper/admin_config.html +8 -0
- package/templates/ai-helper/analytics.html +8 -0
- package/templates/ai-helper/dashboard.html +8 -0
- package/templates/ai-helper/teacher_conversation_detail.html +8 -0
- package/templates/ai-helper/teacher_conversations.html +8 -0
- package/tests/integration/README.md +86 -0
- package/tests/integration/curl/01-admin-config-set.sh +56 -0
- package/tests/integration/curl/02-student-chat.sh +67 -0
- package/tests/integration/curl/03-teacher-list.sh +52 -0
- package/tests/integration/curl/04-teacher-detail.sh +37 -0
- package/tests/integration/curl/05-export.sh +49 -0
- package/tests/integration/curl/06-analytics.sh +43 -0
- package/tests/performance/README.md +85 -0
- package/tests/performance/data/prepare-sample-data.md +57 -0
- package/tests/performance/scripts/export-csv-k6.js +41 -0
- package/tests/performance/scripts/student-chat-k6.js +44 -0
- package/tests/performance/scripts/teacher-conversations-k6.js +33 -0
- package/tsconfig.json +42 -0
- package/tsconfig.vercel.json +27 -0
- package/types/hydrooj/index.d.ts +73 -0
- package/vercel.json +3 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 教师端 Handler
|
|
4
|
+
* 处理教师查看对话列表和详情的请求
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ConversationDetailHandlerPriv = exports.ConversationListHandlerPriv = exports.ConversationDetailHandler = exports.ConversationListHandler = void 0;
|
|
8
|
+
const hydrooj_1 = require("hydrooj");
|
|
9
|
+
const mongo_1 = require("../utils/mongo");
|
|
10
|
+
const httpHelpers_1 = require("../lib/httpHelpers");
|
|
11
|
+
const queryHelpers_1 = require("../lib/queryHelpers");
|
|
12
|
+
const domainHelper_1 = require("../utils/domainHelper");
|
|
13
|
+
/**
|
|
14
|
+
* 批量获取用户名映射
|
|
15
|
+
* @param uids 用户 ID 数组
|
|
16
|
+
* @returns uid -> uname 映射表
|
|
17
|
+
*/
|
|
18
|
+
async function getUserNameMap(uids) {
|
|
19
|
+
const uniqueUids = [...new Set(uids)];
|
|
20
|
+
const userMap = new Map();
|
|
21
|
+
if (uniqueUids.length === 0) {
|
|
22
|
+
return userMap;
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
// 直接使用 HydroOJ db 访问 user 集合
|
|
26
|
+
const userColl = hydrooj_1.db.collection('user');
|
|
27
|
+
const users = await userColl.find({ _id: { $in: uniqueUids } }).toArray();
|
|
28
|
+
for (const user of users) {
|
|
29
|
+
const u = user;
|
|
30
|
+
userMap.set(u._id, u.uname || '已删除用户');
|
|
31
|
+
}
|
|
32
|
+
// 对于不存在的用户,设置默认值
|
|
33
|
+
for (const uid of uniqueUids) {
|
|
34
|
+
if (!userMap.has(uid)) {
|
|
35
|
+
userMap.set(uid, '已删除用户');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.error('[AI Helper] Failed to fetch user names:', err);
|
|
41
|
+
// 出错时全部使用默认值
|
|
42
|
+
for (const uid of uniqueUids) {
|
|
43
|
+
userMap.set(uid, '已删除用户');
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return userMap;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* T031/T032: 生成题目详情页 URL
|
|
50
|
+
* @param domainId 域 ID
|
|
51
|
+
* @param problemId 题目 ID
|
|
52
|
+
* @returns 题目详情页 URL
|
|
53
|
+
*/
|
|
54
|
+
function buildProblemUrl(domainId, problemId) {
|
|
55
|
+
if (!problemId)
|
|
56
|
+
return '';
|
|
57
|
+
// 域前缀格式:/d/:domainId/p/:problemId
|
|
58
|
+
// 主站格式:/p/:problemId
|
|
59
|
+
if (domainId && domainId !== 'system') {
|
|
60
|
+
return `/d/${domainId}/p/${problemId}`;
|
|
61
|
+
}
|
|
62
|
+
return `/p/${problemId}`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* ConversationListHandler - 获取对话列表
|
|
66
|
+
* GET /ai-helper/conversations
|
|
67
|
+
* GET /d/:domainId/ai-helper/conversations
|
|
68
|
+
*/
|
|
69
|
+
class ConversationListHandler extends hydrooj_1.Handler {
|
|
70
|
+
async get() {
|
|
71
|
+
try {
|
|
72
|
+
const wantJson = (0, httpHelpers_1.expectsJson)(this);
|
|
73
|
+
const conversationModel = this.ctx.get('conversationModel');
|
|
74
|
+
// 获取当前域 ID(用于域隔离)
|
|
75
|
+
const domainId = (0, domainHelper_1.getDomainId)(this);
|
|
76
|
+
// 从查询参数读取筛选条件
|
|
77
|
+
const { startDate, endDate, problemId, classId, userId, page = '1', limit = '50' } = this.request.query;
|
|
78
|
+
// 解析分页参数
|
|
79
|
+
const { page: pageNum, limit: limitNum } = (0, queryHelpers_1.parsePaginationParams)(page, limit);
|
|
80
|
+
// 构造筛选条件(始终包含 domainId 以实现域隔离)
|
|
81
|
+
const filters = {
|
|
82
|
+
domainId // 域隔离:只查询当前域的对话
|
|
83
|
+
};
|
|
84
|
+
if (startDate) {
|
|
85
|
+
filters.startDate = startDate;
|
|
86
|
+
}
|
|
87
|
+
if (endDate) {
|
|
88
|
+
filters.endDate = endDate;
|
|
89
|
+
}
|
|
90
|
+
if (problemId) {
|
|
91
|
+
filters.problemId = problemId;
|
|
92
|
+
}
|
|
93
|
+
if (classId) {
|
|
94
|
+
filters.classId = classId;
|
|
95
|
+
}
|
|
96
|
+
if (userId) {
|
|
97
|
+
filters.userId = parseInt(userId, 10);
|
|
98
|
+
}
|
|
99
|
+
// 查询对话列表(已通过 domainId 实现域隔离)
|
|
100
|
+
const { conversations, total } = await conversationModel.findByFilters(filters, pageNum, limitNum);
|
|
101
|
+
// 批量获取用户名(避免 N+1 查询)
|
|
102
|
+
const uids = conversations.map(conv => conv.userId);
|
|
103
|
+
const userNameMap = await getUserNameMap(uids);
|
|
104
|
+
// T048: 批量获取每个会话的第一条学生消息
|
|
105
|
+
const messageModel = this.ctx.get('messageModel');
|
|
106
|
+
const conversationIds = conversations.map(conv => conv._id);
|
|
107
|
+
const firstMessagesMap = await messageModel.findFirstStudentMessagesForConversations(conversationIds);
|
|
108
|
+
// T031: 转换为响应格式(包含 problemUrl 和 firstMessageSummary)
|
|
109
|
+
const conversationSummaries = conversations.map(conv => {
|
|
110
|
+
const convIdStr = conv._id.toString();
|
|
111
|
+
const firstMsg = firstMessagesMap.get(convIdStr);
|
|
112
|
+
// T048: 截取前100字作为摘要
|
|
113
|
+
let firstMessageSummary;
|
|
114
|
+
if (firstMsg?.content) {
|
|
115
|
+
firstMessageSummary = firstMsg.content.length > 100
|
|
116
|
+
? firstMsg.content.substring(0, 100) + '...'
|
|
117
|
+
: firstMsg.content;
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
_id: convIdStr,
|
|
121
|
+
userId: conv.userId,
|
|
122
|
+
userName: userNameMap.get(conv.userId) || '已删除用户',
|
|
123
|
+
classId: conv.classId,
|
|
124
|
+
problemId: conv.problemId,
|
|
125
|
+
problemUrl: buildProblemUrl(domainId, conv.problemId), // T031: 题目链接
|
|
126
|
+
startTime: conv.startTime.toISOString(),
|
|
127
|
+
endTime: conv.endTime.toISOString(),
|
|
128
|
+
messageCount: conv.messageCount,
|
|
129
|
+
isEffective: conv.isEffective,
|
|
130
|
+
tags: conv.tags,
|
|
131
|
+
teacherNote: conv.teacherNote,
|
|
132
|
+
metadata: conv.metadata,
|
|
133
|
+
firstMessageSummary // T048: 学生问题摘要
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
if (wantJson) {
|
|
137
|
+
(0, httpHelpers_1.setJsonResponse)(this, {
|
|
138
|
+
conversations: conversationSummaries,
|
|
139
|
+
total,
|
|
140
|
+
page: pageNum,
|
|
141
|
+
limit: limitNum
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
(0, httpHelpers_1.setTemplateResponse)(this, 'ai-helper/teacher_conversations.html', {
|
|
146
|
+
total,
|
|
147
|
+
page: pageNum,
|
|
148
|
+
limit: limitNum
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.error('[AI Helper] ConversationListHandler error:', err);
|
|
153
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'INTERNAL_ERROR', err instanceof Error ? err.message : '服务器内部错误', 500);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.ConversationListHandler = ConversationListHandler;
|
|
158
|
+
/**
|
|
159
|
+
* ConversationDetailHandler - 获取对话详情
|
|
160
|
+
* GET /ai-helper/conversations/:id
|
|
161
|
+
* GET /d/:domainId/ai-helper/conversations/:id
|
|
162
|
+
*/
|
|
163
|
+
class ConversationDetailHandler extends hydrooj_1.Handler {
|
|
164
|
+
async get({ id }) {
|
|
165
|
+
try {
|
|
166
|
+
const wantJson = (0, httpHelpers_1.expectsJson)(this);
|
|
167
|
+
const conversationModel = this.ctx.get('conversationModel');
|
|
168
|
+
const messageModel = this.ctx.get('messageModel');
|
|
169
|
+
// 获取当前域 ID(用于域隔离验证)
|
|
170
|
+
const domainId = (0, domainHelper_1.getDomainId)(this);
|
|
171
|
+
if (!mongo_1.ObjectId.isValid(id)) {
|
|
172
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'INVALID_ID', '无效的会话 ID');
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
// 查询会话详情
|
|
176
|
+
const conversation = await conversationModel.findById(id);
|
|
177
|
+
if (!conversation) {
|
|
178
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'NOT_FOUND', '会话不存在', 404);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// 域隔离验证:确保对话属于当前域
|
|
182
|
+
// 特殊处理:
|
|
183
|
+
// 1. 对话的 domainId 为 'system'(历史数据迁移默认值)时,允许任何域访问
|
|
184
|
+
// 2. 当前访问域为 'system'(主站访问)时,允许访问所有域的对话
|
|
185
|
+
const conversationDomain = conversation.domainId || 'system';
|
|
186
|
+
if (conversationDomain !== domainId && conversationDomain !== 'system' && domainId !== 'system') {
|
|
187
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'FORBIDDEN', '无权访问此对话', 403);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// 查询会话的所有消息 (按时间升序)
|
|
191
|
+
const messages = await messageModel.findByConversationId(id);
|
|
192
|
+
// 转换消息格式
|
|
193
|
+
const messagesFormatted = messages.map(msg => ({
|
|
194
|
+
_id: msg._id.toString(),
|
|
195
|
+
role: msg.role,
|
|
196
|
+
content: msg.content,
|
|
197
|
+
timestamp: msg.timestamp.toISOString(),
|
|
198
|
+
questionType: msg.questionType,
|
|
199
|
+
attachedCode: msg.attachedCode,
|
|
200
|
+
attachedError: msg.attachedError,
|
|
201
|
+
metadata: msg.metadata
|
|
202
|
+
}));
|
|
203
|
+
// 获取用户名
|
|
204
|
+
const userNameMap = await getUserNameMap([conversation.userId]);
|
|
205
|
+
const userName = userNameMap.get(conversation.userId) || '已删除用户';
|
|
206
|
+
// T032: 对话详情响应(包含 problemUrl)
|
|
207
|
+
const conversationData = {
|
|
208
|
+
_id: conversation._id.toString(),
|
|
209
|
+
userId: conversation.userId,
|
|
210
|
+
userName,
|
|
211
|
+
classId: conversation.classId,
|
|
212
|
+
problemId: conversation.problemId,
|
|
213
|
+
problemUrl: buildProblemUrl(domainId, conversation.problemId), // T032: 题目链接
|
|
214
|
+
startTime: conversation.startTime.toISOString(),
|
|
215
|
+
endTime: conversation.endTime.toISOString(),
|
|
216
|
+
messageCount: conversation.messageCount,
|
|
217
|
+
isEffective: conversation.isEffective,
|
|
218
|
+
tags: conversation.tags,
|
|
219
|
+
teacherNote: conversation.teacherNote,
|
|
220
|
+
metadata: conversation.metadata
|
|
221
|
+
};
|
|
222
|
+
if (wantJson) {
|
|
223
|
+
(0, httpHelpers_1.setJsonResponse)(this, {
|
|
224
|
+
conversation: conversationData,
|
|
225
|
+
messages: messagesFormatted
|
|
226
|
+
});
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
(0, httpHelpers_1.setTemplateResponse)(this, 'ai-helper/teacher_conversation_detail.html', {
|
|
230
|
+
conversation: conversationData,
|
|
231
|
+
messages: messagesFormatted
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
console.error('[AI Helper] ConversationDetailHandler error:', err);
|
|
236
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'INTERNAL_ERROR', err instanceof Error ? err.message : '服务器内部错误', 500);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
exports.ConversationDetailHandler = ConversationDetailHandler;
|
|
241
|
+
// 导出路由权限配置
|
|
242
|
+
// 使用 PRIV.PRIV_EDIT_SYSTEM (root-only 权限)
|
|
243
|
+
// AI 对话数据敏感,目前仅允许系统管理员访问
|
|
244
|
+
exports.ConversationListHandlerPriv = hydrooj_1.PRIV.PRIV_EDIT_SYSTEM;
|
|
245
|
+
exports.ConversationDetailHandlerPriv = hydrooj_1.PRIV.PRIV_EDIT_SYSTEM;
|
|
246
|
+
//# sourceMappingURL=teacherHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teacherHandler.js","sourceRoot":"","sources":["../../src/handlers/teacherHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 测试路由 Handler
|
|
4
|
+
* 用于验证插件加载和路由注册是否成功
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.HelloHandlerPriv = exports.HelloHandler = void 0;
|
|
8
|
+
const hydrooj_1 = require("hydrooj");
|
|
9
|
+
/**
|
|
10
|
+
* Hello 测试 Handler
|
|
11
|
+
* GET /ai-helper/hello - 返回插件状态信息
|
|
12
|
+
*/
|
|
13
|
+
class HelloHandler extends hydrooj_1.Handler {
|
|
14
|
+
async get() {
|
|
15
|
+
this.response.body = {
|
|
16
|
+
message: 'AI Helper Plugin Loaded',
|
|
17
|
+
version: '0.1.0',
|
|
18
|
+
timestamp: new Date().toISOString(),
|
|
19
|
+
status: 'ok'
|
|
20
|
+
};
|
|
21
|
+
this.response.type = 'application/json';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.HelloHandler = HelloHandler;
|
|
25
|
+
// 导出路由权限配置(最低权限 - 任何人可访问)
|
|
26
|
+
exports.HelloHandlerPriv = hydrooj_1.PRIV.PRIV_NONE;
|
|
27
|
+
//# sourceMappingURL=testHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testHandler.js","sourceRoot":"","sources":["../../src/handlers/testHandler.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,qCAAwC;AAExC;;;GAGG;AACH,MAAa,YAAa,SAAQ,iBAAO;IACvC,KAAK,CAAC,GAAG;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG;YACnB,OAAO,EAAE,yBAAyB;YAClC,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,MAAM,EAAE,IAAI;SACb,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,kBAAkB,CAAC;IAC1C,CAAC;CACF;AAVD,oCAUC;AAED,0BAA0B;AACb,QAAA,gBAAgB,GAAG,cAAI,CAAC,SAAS,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* UpdateHandler - 插件更新 API 处理器
|
|
4
|
+
*
|
|
5
|
+
* 提供插件在线更新接口:
|
|
6
|
+
* GET /ai-helper/admin/update/info - 获取更新信息
|
|
7
|
+
* POST /ai-helper/admin/update - 执行更新
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.UpdateHandlerPriv = exports.UpdateHandler = exports.UpdateInfoHandlerPriv = exports.UpdateInfoHandler = void 0;
|
|
11
|
+
const hydrooj_1 = require("hydrooj");
|
|
12
|
+
const updateService_1 = require("../services/updateService");
|
|
13
|
+
const httpHelpers_1 = require("../lib/httpHelpers");
|
|
14
|
+
/**
|
|
15
|
+
* UpdateInfoHandler - 获取更新信息
|
|
16
|
+
* GET /ai-helper/admin/update/info
|
|
17
|
+
*
|
|
18
|
+
* 响应:
|
|
19
|
+
* {
|
|
20
|
+
* pluginPath: string, // 插件安装路径
|
|
21
|
+
* isValid: boolean, // 路径是否有效
|
|
22
|
+
* message: string // 验证消息
|
|
23
|
+
* }
|
|
24
|
+
*/
|
|
25
|
+
class UpdateInfoHandler extends hydrooj_1.Handler {
|
|
26
|
+
async get() {
|
|
27
|
+
try {
|
|
28
|
+
const updateService = new updateService_1.UpdateService();
|
|
29
|
+
const info = updateService.getPluginInfo();
|
|
30
|
+
(0, httpHelpers_1.setJsonResponse)(this, info);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error('[UpdateInfoHandler] Error:', err);
|
|
34
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'UPDATE_INFO_FAILED', err instanceof Error ? err.message : '获取更新信息失败', 500);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.UpdateInfoHandler = UpdateInfoHandler;
|
|
39
|
+
// 导出路由权限配置 - root-only
|
|
40
|
+
exports.UpdateInfoHandlerPriv = hydrooj_1.PRIV.PRIV_EDIT_SYSTEM;
|
|
41
|
+
/**
|
|
42
|
+
* UpdateHandler - 执行更新
|
|
43
|
+
* POST /ai-helper/admin/update
|
|
44
|
+
*
|
|
45
|
+
* 响应:
|
|
46
|
+
* {
|
|
47
|
+
* success: boolean,
|
|
48
|
+
* step: string,
|
|
49
|
+
* message: string,
|
|
50
|
+
* logs: string[],
|
|
51
|
+
* pluginPath?: string,
|
|
52
|
+
* error?: string
|
|
53
|
+
* }
|
|
54
|
+
*/
|
|
55
|
+
class UpdateHandler extends hydrooj_1.Handler {
|
|
56
|
+
async post() {
|
|
57
|
+
try {
|
|
58
|
+
const updateService = new updateService_1.UpdateService();
|
|
59
|
+
// 收集所有日志
|
|
60
|
+
const allLogs = [];
|
|
61
|
+
// 执行更新
|
|
62
|
+
const result = await updateService.performUpdate((step, log) => {
|
|
63
|
+
allLogs.push(`[${step}] ${log}`);
|
|
64
|
+
console.log(`[UpdateHandler] ${step}: ${log}`);
|
|
65
|
+
});
|
|
66
|
+
(0, httpHelpers_1.setJsonResponse)(this, {
|
|
67
|
+
success: result.success,
|
|
68
|
+
step: result.step,
|
|
69
|
+
message: result.message,
|
|
70
|
+
logs: result.logs,
|
|
71
|
+
pluginPath: result.pluginPath,
|
|
72
|
+
error: result.error
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error('[UpdateHandler] Error:', err);
|
|
77
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'UPDATE_FAILED', err instanceof Error ? err.message : '更新失败', 500);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.UpdateHandler = UpdateHandler;
|
|
82
|
+
// 导出路由权限配置 - root-only
|
|
83
|
+
exports.UpdateHandlerPriv = hydrooj_1.PRIV.PRIV_EDIT_SYSTEM;
|
|
84
|
+
//# sourceMappingURL=updateHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateHandler.js","sourceRoot":"","sources":["../../src/handlers/updateHandler.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,qCAAwC;AACxC,6DAA0D;AAC1D,oDAAuE;AAEvE;;;;;;;;;;GAUG;AACH,MAAa,iBAAkB,SAAQ,iBAAO;IAC5C,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,6BAAa,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,aAAa,EAAE,CAAC;YAE3C,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACjD,IAAA,8BAAgB,EAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;CACF;AAZD,8CAYC;AAED,uBAAuB;AACV,QAAA,qBAAqB,GAAG,cAAI,CAAC,gBAAgB,CAAC;AAE3D;;;;;;;;;;;;;GAaG;AACH,MAAa,aAAc,SAAQ,iBAAO;IACxC,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,6BAAa,EAAE,CAAC;YAE1C,SAAS;YACT,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,OAAO;YACP,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,IAAA,6BAAe,EAAC,IAAI,EAAE;gBACpB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC7C,IAAA,8BAAgB,EAAC,IAAI,EAAE,eAAe,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC;CACF;AA3BD,sCA2BC;AAED,uBAAuB;AACV,QAAA,iBAAiB,GAAG,cAAI,CAAC,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Version Handler - 版本检测 API 处理器
|
|
4
|
+
*
|
|
5
|
+
* T051: 提供版本检测接口
|
|
6
|
+
* GET /ai-helper/version/check - 检查版本更新
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.VersionCheckHandlerPriv = exports.VersionCheckHandler = void 0;
|
|
10
|
+
const hydrooj_1 = require("hydrooj");
|
|
11
|
+
const httpHelpers_1 = require("../lib/httpHelpers");
|
|
12
|
+
/**
|
|
13
|
+
* VersionCheckHandler - 检查版本更新
|
|
14
|
+
* GET /ai-helper/version/check
|
|
15
|
+
* GET /d/:domainId/ai-helper/version/check
|
|
16
|
+
*
|
|
17
|
+
* 查询参数:
|
|
18
|
+
* - refresh: 是否强制刷新(忽略缓存),默认 false
|
|
19
|
+
*
|
|
20
|
+
* 响应:
|
|
21
|
+
* {
|
|
22
|
+
* currentVersion: string, // 当前安装版本
|
|
23
|
+
* latestVersion: string, // 远程最新版本
|
|
24
|
+
* hasUpdate: boolean, // 是否有可用更新
|
|
25
|
+
* releaseUrl: string, // 发布页面 URL
|
|
26
|
+
* releaseNotes?: string, // 更新说明(如有)
|
|
27
|
+
* checkedAt: string, // 检查时间(ISO 格式)
|
|
28
|
+
* fromCache: boolean // 是否来自缓存
|
|
29
|
+
* }
|
|
30
|
+
*/
|
|
31
|
+
class VersionCheckHandler extends hydrooj_1.Handler {
|
|
32
|
+
async get() {
|
|
33
|
+
try {
|
|
34
|
+
const versionService = this.ctx.get('versionService');
|
|
35
|
+
// 检查是否强制刷新
|
|
36
|
+
const refresh = this.request.query.refresh === 'true';
|
|
37
|
+
// 检查版本更新
|
|
38
|
+
const result = await versionService.checkForUpdates(refresh);
|
|
39
|
+
(0, httpHelpers_1.setJsonResponse)(this, {
|
|
40
|
+
currentVersion: result.currentVersion,
|
|
41
|
+
latestVersion: result.latestVersion,
|
|
42
|
+
hasUpdate: result.hasUpdate,
|
|
43
|
+
releaseUrl: result.releaseUrl,
|
|
44
|
+
releaseNotes: result.releaseNotes,
|
|
45
|
+
checkedAt: result.checkedAt.toISOString(),
|
|
46
|
+
fromCache: result.fromCache,
|
|
47
|
+
source: result.source
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.error('[VersionCheckHandler] Error:', err);
|
|
52
|
+
(0, httpHelpers_1.setErrorResponse)(this, 'VERSION_CHECK_FAILED', err instanceof Error ? err.message : '版本检查失败', 500);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.VersionCheckHandler = VersionCheckHandler;
|
|
57
|
+
// 导出路由权限配置
|
|
58
|
+
// 使用 PRIV.PRIV_EDIT_SYSTEM (root-only 权限)
|
|
59
|
+
// 版本检查仅限管理员访问
|
|
60
|
+
exports.VersionCheckHandlerPriv = hydrooj_1.PRIV.PRIV_EDIT_SYSTEM;
|
|
61
|
+
//# sourceMappingURL=versionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versionHandler.js","sourceRoot":"","sources":["../../src/handlers/versionHandler.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,qCAAwC;AAExC,oDAAuE;AAEvE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAa,mBAAoB,SAAQ,iBAAO;IAC9C,KAAK,CAAC,GAAG;QACP,IAAI,CAAC;YACH,MAAM,cAAc,GAAmB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAEtE,WAAW;YACX,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC;YAEtD,SAAS;YACT,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAE7D,IAAA,6BAAe,EAAC,IAAI,EAAE;gBACpB,cAAc,EAAE,MAAM,CAAC,cAAc;gBACrC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACnD,IAAA,8BAAgB,EAAC,IAAI,EAAE,sBAAsB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACrG,CAAC;IACH,CAAC;CACF;AA1BD,kDA0BC;AAED,WAAW;AACX,0CAA0C;AAC1C,cAAc;AACD,QAAA,uBAAuB,GAAG,cAAI,CAAC,gBAAgB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HydroOJ AI Learning Assistant Plugin
|
|
3
|
+
*
|
|
4
|
+
* 教学优先的 AI 辅助学习插件
|
|
5
|
+
* - 引导式学习,不提供完整代码
|
|
6
|
+
* - 对话记录可追踪
|
|
7
|
+
* - 符合教学研究需求
|
|
8
|
+
*/
|
|
9
|
+
import { Context } from 'hydrooj';
|
|
10
|
+
/**
|
|
11
|
+
* 插件配置接口
|
|
12
|
+
*/
|
|
13
|
+
export interface AIHelperConfig {
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 插件入口函数
|
|
17
|
+
* @param ctx HydroOJ Context
|
|
18
|
+
* @param config 插件配置
|
|
19
|
+
*/
|
|
20
|
+
export declare function apply(ctx: Context, config?: AIHelperConfig): void;
|
|
21
|
+
export declare const Config: {};
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,cAAc;CAE9B;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,cAAmB,QAK9D;AAGD,eAAO,MAAM,MAAM,IAElB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HydroOJ AI Learning Assistant Plugin
|
|
4
|
+
*
|
|
5
|
+
* 教学优先的 AI 辅助学习插件
|
|
6
|
+
* - 引导式学习,不提供完整代码
|
|
7
|
+
* - 对话记录可追踪
|
|
8
|
+
* - 符合教学研究需求
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.apply = exports.Config = void 0;
|
|
12
|
+
console.log('[AI-Helper] Loading plugin...');
|
|
13
|
+
const hydrooj_1 = require("hydrooj");
|
|
14
|
+
console.log('[AI-Helper] hydrooj imports OK');
|
|
15
|
+
const testHandler_1 = require("./handlers/testHandler");
|
|
16
|
+
console.log('[AI-Helper] testHandler OK');
|
|
17
|
+
const studentHandler_1 = require("./handlers/studentHandler");
|
|
18
|
+
console.log('[AI-Helper] studentHandler OK');
|
|
19
|
+
const teacherHandler_1 = require("./handlers/teacherHandler");
|
|
20
|
+
console.log('[AI-Helper] teacherHandler OK');
|
|
21
|
+
const analyticsHandler_1 = require("./handlers/analyticsHandler");
|
|
22
|
+
console.log('[AI-Helper] analyticsHandler OK');
|
|
23
|
+
const adminConfigHandler_1 = require("./handlers/adminConfigHandler");
|
|
24
|
+
console.log('[AI-Helper] adminConfigHandler OK');
|
|
25
|
+
const dashboardHandler_1 = require("./handlers/dashboardHandler");
|
|
26
|
+
console.log('[AI-Helper] dashboardHandler OK');
|
|
27
|
+
const exportHandler_1 = require("./handlers/exportHandler");
|
|
28
|
+
console.log('[AI-Helper] exportHandler OK');
|
|
29
|
+
const adminHandler_1 = require("./handlers/adminHandler");
|
|
30
|
+
console.log('[AI-Helper] adminHandler OK');
|
|
31
|
+
const versionHandler_1 = require("./handlers/versionHandler");
|
|
32
|
+
console.log('[AI-Helper] versionHandler OK');
|
|
33
|
+
const updateHandler_1 = require("./handlers/updateHandler");
|
|
34
|
+
console.log('[AI-Helper] updateHandler OK');
|
|
35
|
+
const conversation_1 = require("./models/conversation");
|
|
36
|
+
const message_1 = require("./models/message");
|
|
37
|
+
const rateLimitRecord_1 = require("./models/rateLimitRecord");
|
|
38
|
+
const aiConfig_1 = require("./models/aiConfig");
|
|
39
|
+
const jailbreakLog_1 = require("./models/jailbreakLog");
|
|
40
|
+
const versionCache_1 = require("./models/versionCache");
|
|
41
|
+
const pluginInstall_1 = require("./models/pluginInstall");
|
|
42
|
+
console.log('[AI-Helper] models OK');
|
|
43
|
+
const migrationService_1 = require("./services/migrationService");
|
|
44
|
+
const versionService_1 = require("./services/versionService");
|
|
45
|
+
const telemetryService_1 = require("./services/telemetryService");
|
|
46
|
+
console.log('[AI-Helper] services OK');
|
|
47
|
+
console.log('[AI-Helper] All imports completed successfully');
|
|
48
|
+
/**
|
|
49
|
+
* 插件入口函数
|
|
50
|
+
* @param ctx HydroOJ Context
|
|
51
|
+
* @param config 插件配置
|
|
52
|
+
*/
|
|
53
|
+
const configSchema = hydrooj_1.Schema.object({}).description('AI 助手插件配置(预留)').default({});
|
|
54
|
+
const aiHelperPlugin = (0, hydrooj_1.definePlugin)({
|
|
55
|
+
name: 'hydro-ai-helper',
|
|
56
|
+
schema: configSchema,
|
|
57
|
+
async apply(ctx) {
|
|
58
|
+
// 初始化数据库模型
|
|
59
|
+
const db = ctx.db;
|
|
60
|
+
const conversationModel = new conversation_1.ConversationModel(db);
|
|
61
|
+
const messageModel = new message_1.MessageModel(db);
|
|
62
|
+
const rateLimitRecordModel = new rateLimitRecord_1.RateLimitRecordModel(db);
|
|
63
|
+
const aiConfigModel = new aiConfig_1.AIConfigModel(db);
|
|
64
|
+
const jailbreakLogModel = new jailbreakLog_1.JailbreakLogModel(db);
|
|
65
|
+
const versionCacheModel = new versionCache_1.VersionCacheModel(db);
|
|
66
|
+
const pluginInstallModel = new pluginInstall_1.PluginInstallModel(db);
|
|
67
|
+
// 创建数据库索引
|
|
68
|
+
await conversationModel.ensureIndexes();
|
|
69
|
+
await messageModel.ensureIndexes();
|
|
70
|
+
await rateLimitRecordModel.ensureIndexes();
|
|
71
|
+
await aiConfigModel.ensureIndexes();
|
|
72
|
+
await jailbreakLogModel.ensureIndexes();
|
|
73
|
+
await versionCacheModel.ensureIndexes();
|
|
74
|
+
await pluginInstallModel.ensureIndexes();
|
|
75
|
+
// 执行数据迁移(为历史数据添加 domainId)
|
|
76
|
+
const migrationService = new migrationService_1.MigrationService(db);
|
|
77
|
+
await migrationService.runAllMigrations();
|
|
78
|
+
// 初始化插件安装记录
|
|
79
|
+
const packageJson = require('../package.json');
|
|
80
|
+
const currentVersion = packageJson.version || '1.8.0';
|
|
81
|
+
await pluginInstallModel.createIfMissing(currentVersion);
|
|
82
|
+
// 将模型实例注入到 ctx 中,供 Handler 使用
|
|
83
|
+
ctx.provide('conversationModel', conversationModel);
|
|
84
|
+
ctx.provide('messageModel', messageModel);
|
|
85
|
+
ctx.provide('rateLimitRecordModel', rateLimitRecordModel);
|
|
86
|
+
ctx.provide('aiConfigModel', aiConfigModel);
|
|
87
|
+
ctx.provide('jailbreakLogModel', jailbreakLogModel);
|
|
88
|
+
ctx.provide('versionCacheModel', versionCacheModel);
|
|
89
|
+
ctx.provide('pluginInstallModel', pluginInstallModel);
|
|
90
|
+
// 初始化版本服务
|
|
91
|
+
const versionService = new versionService_1.VersionService(versionCacheModel);
|
|
92
|
+
ctx.provide('versionService', versionService);
|
|
93
|
+
// 初始化遥测服务(延迟 5 秒启动,避免阻塞插件加载)
|
|
94
|
+
const telemetryService = new telemetryService_1.TelemetryService(pluginInstallModel, conversationModel);
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
telemetryService.init().catch(err => {
|
|
97
|
+
console.error('[AI-Helper] Telemetry service initialization failed:', err);
|
|
98
|
+
});
|
|
99
|
+
}, 5000);
|
|
100
|
+
// 注册测试路由
|
|
101
|
+
// GET /ai-helper/hello - 返回插件状态
|
|
102
|
+
ctx.Route('ai_helper_hello', '/ai-helper/hello', testHandler_1.HelloHandler, testHandler_1.HelloHandlerPriv);
|
|
103
|
+
// 注册学生端对话路由 (支持域前缀)
|
|
104
|
+
// POST /ai-helper/chat - 学生提交问题获得 AI 回答
|
|
105
|
+
ctx.Route('ai_helper_chat', '/ai-helper/chat', studentHandler_1.ChatHandler, studentHandler_1.ChatHandlerPriv);
|
|
106
|
+
// 域前缀路由: /d/:domainId/ai-helper/chat
|
|
107
|
+
ctx.Route('ai_helper_chat_domain', '/d/:domainId/ai-helper/chat', studentHandler_1.ChatHandler, studentHandler_1.ChatHandlerPriv);
|
|
108
|
+
// GET /ai-helper/problem-status/:problemId - 查询用户在该题的提交状态(是否已 AC)
|
|
109
|
+
ctx.Route('ai_helper_problem_status', '/ai-helper/problem-status/:problemId', studentHandler_1.ProblemStatusHandler, studentHandler_1.ProblemStatusHandlerPriv);
|
|
110
|
+
ctx.Route('ai_helper_problem_status_domain', '/d/:domainId/ai-helper/problem-status/:problemId', studentHandler_1.ProblemStatusHandler, studentHandler_1.ProblemStatusHandlerPriv);
|
|
111
|
+
// 注册教师端路由 (支持域前缀)
|
|
112
|
+
// 当前设计:AI 学习助手对话统计非常敏感,仅允许 root 访问。
|
|
113
|
+
// 注意:这里使用的是 root-only 的系统权限(PRIV.PRIV_EDIT_SYSTEM),普通老师也无权访问。
|
|
114
|
+
// TODO(如需求变更): 未来若有专门的教师统计角色,再考虑降低权限。
|
|
115
|
+
// 注入控制面板菜单项(统一入口)
|
|
116
|
+
ctx.injectUI('ControlPanel', 'ai_helper');
|
|
117
|
+
// AI 助手统一入口路由
|
|
118
|
+
ctx.Route('ai_helper', '/ai-helper', dashboardHandler_1.AIHelperDashboardHandler, dashboardHandler_1.AIHelperDashboardHandlerPriv);
|
|
119
|
+
ctx.Route('ai_helper_domain', '/d/:domainId/ai-helper', dashboardHandler_1.AIHelperDashboardHandler, dashboardHandler_1.AIHelperDashboardHandlerPriv);
|
|
120
|
+
// GET /ai-helper/conversations - 获取对话列表
|
|
121
|
+
ctx.Route('ai_helper_conversations', '/ai-helper/conversations', teacherHandler_1.ConversationListHandler, teacherHandler_1.ConversationListHandlerPriv);
|
|
122
|
+
ctx.Route('ai_helper_conversations_domain', '/d/:domainId/ai-helper/conversations', teacherHandler_1.ConversationListHandler, teacherHandler_1.ConversationListHandlerPriv);
|
|
123
|
+
// GET /ai-helper/conversations/:id - 获取对话详情
|
|
124
|
+
ctx.Route('ai_helper_conversation_detail', '/ai-helper/conversations/:id', teacherHandler_1.ConversationDetailHandler, teacherHandler_1.ConversationDetailHandlerPriv);
|
|
125
|
+
ctx.Route('ai_helper_conversation_detail_domain', '/d/:domainId/ai-helper/conversations/:id', teacherHandler_1.ConversationDetailHandler, teacherHandler_1.ConversationDetailHandlerPriv);
|
|
126
|
+
// GET /ai-helper/analytics - AI 使用统计页面
|
|
127
|
+
ctx.Route('ai_helper_analytics', '/ai-helper/analytics', analyticsHandler_1.AnalyticsHandler, analyticsHandler_1.AnalyticsHandlerPriv);
|
|
128
|
+
ctx.Route('ai_helper_analytics_domain', '/d/:domainId/ai-helper/analytics', analyticsHandler_1.AnalyticsHandler, analyticsHandler_1.AnalyticsHandlerPriv);
|
|
129
|
+
// GET /ai-helper/admin/config - AI 配置页面 & JSON API(通过 Accept 头区分)
|
|
130
|
+
ctx.Route('ai_helper_admin_config', '/ai-helper/admin/config', adminConfigHandler_1.AdminConfigHandler, adminConfigHandler_1.AdminConfigHandlerPriv);
|
|
131
|
+
// GET /ai-helper/export - 数据导出 API
|
|
132
|
+
ctx.Route('ai_helper_export', '/ai-helper/export', exportHandler_1.ExportHandler, exportHandler_1.ExportHandlerPriv);
|
|
133
|
+
ctx.Route('ai_helper_export_domain', '/d/:domainId/ai-helper/export', exportHandler_1.ExportHandler, exportHandler_1.ExportHandlerPriv);
|
|
134
|
+
// POST /ai-helper/admin/test-connection - 测试连接
|
|
135
|
+
ctx.Route('ai_helper_admin_test_connection', '/ai-helper/admin/test-connection', adminHandler_1.TestConnectionHandler, adminHandler_1.TestConnectionHandlerPriv);
|
|
136
|
+
// POST /ai-helper/admin/fetch-models - 获取可用模型列表
|
|
137
|
+
ctx.Route('ai_helper_admin_fetch_models', '/ai-helper/admin/fetch-models', adminHandler_1.FetchModelsHandler, adminHandler_1.FetchModelsHandlerPriv);
|
|
138
|
+
// T052: GET /ai-helper/version/check - 版本检测
|
|
139
|
+
ctx.Route('ai_helper_version_check', '/ai-helper/version/check', versionHandler_1.VersionCheckHandler, versionHandler_1.VersionCheckHandlerPriv);
|
|
140
|
+
ctx.Route('ai_helper_version_check_domain', '/d/:domainId/ai-helper/version/check', versionHandler_1.VersionCheckHandler, versionHandler_1.VersionCheckHandlerPriv);
|
|
141
|
+
// 插件更新路由
|
|
142
|
+
// GET /ai-helper/admin/update/info - 获取更新信息
|
|
143
|
+
ctx.Route('ai_helper_update_info', '/ai-helper/admin/update/info', updateHandler_1.UpdateInfoHandler, updateHandler_1.UpdateInfoHandlerPriv);
|
|
144
|
+
// POST /ai-helper/admin/update - 执行更新
|
|
145
|
+
ctx.Route('ai_helper_update', '/ai-helper/admin/update', updateHandler_1.UpdateHandler, updateHandler_1.UpdateHandlerPriv);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
exports.Config = configSchema;
|
|
149
|
+
exports.apply = aiHelperPlugin.apply;
|
|
150
|
+
exports.default = aiHelperPlugin;
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|