personalac 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/README.md +249 -0
  2. package/bin/personalac.js +215 -0
  3. package/dist/agent/context.d.ts +39 -0
  4. package/dist/agent/context.d.ts.map +1 -0
  5. package/dist/agent/context.js +163 -0
  6. package/dist/agent/context.js.map +1 -0
  7. package/dist/agent/executors.d.ts +40 -0
  8. package/dist/agent/executors.d.ts.map +1 -0
  9. package/dist/agent/executors.js +177 -0
  10. package/dist/agent/executors.js.map +1 -0
  11. package/dist/agent/index.d.ts +61 -0
  12. package/dist/agent/index.d.ts.map +1 -0
  13. package/dist/agent/index.js +907 -0
  14. package/dist/agent/index.js.map +1 -0
  15. package/dist/agent/planner.d.ts +15 -0
  16. package/dist/agent/planner.d.ts.map +1 -0
  17. package/dist/agent/planner.js +81 -0
  18. package/dist/agent/planner.js.map +1 -0
  19. package/dist/agent/scheduler.d.ts +22 -0
  20. package/dist/agent/scheduler.d.ts.map +1 -0
  21. package/dist/agent/scheduler.js +178 -0
  22. package/dist/agent/scheduler.js.map +1 -0
  23. package/dist/database/index.d.ts +5 -0
  24. package/dist/database/index.d.ts.map +1 -0
  25. package/dist/database/index.js +283 -0
  26. package/dist/database/index.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +141 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/middleware/auth.middleware.d.ts +6 -0
  32. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  33. package/dist/middleware/auth.middleware.js +19 -0
  34. package/dist/middleware/auth.middleware.js.map +1 -0
  35. package/dist/routes/agent.routes.d.ts +3 -0
  36. package/dist/routes/agent.routes.d.ts.map +1 -0
  37. package/dist/routes/agent.routes.js +101 -0
  38. package/dist/routes/agent.routes.js.map +1 -0
  39. package/dist/routes/auth.routes.d.ts +3 -0
  40. package/dist/routes/auth.routes.d.ts.map +1 -0
  41. package/dist/routes/auth.routes.js +66 -0
  42. package/dist/routes/auth.routes.js.map +1 -0
  43. package/dist/routes/chat.routes.d.ts +3 -0
  44. package/dist/routes/chat.routes.d.ts.map +1 -0
  45. package/dist/routes/chat.routes.js +80 -0
  46. package/dist/routes/chat.routes.js.map +1 -0
  47. package/dist/routes/data.routes.d.ts +3 -0
  48. package/dist/routes/data.routes.d.ts.map +1 -0
  49. package/dist/routes/data.routes.js +16 -0
  50. package/dist/routes/data.routes.js.map +1 -0
  51. package/dist/routes/email.routes.d.ts +3 -0
  52. package/dist/routes/email.routes.d.ts.map +1 -0
  53. package/dist/routes/email.routes.js +18 -0
  54. package/dist/routes/email.routes.js.map +1 -0
  55. package/dist/routes/goals.routes.d.ts +3 -0
  56. package/dist/routes/goals.routes.d.ts.map +1 -0
  57. package/dist/routes/goals.routes.js +45 -0
  58. package/dist/routes/goals.routes.js.map +1 -0
  59. package/dist/routes/plans.routes.d.ts +3 -0
  60. package/dist/routes/plans.routes.d.ts.map +1 -0
  61. package/dist/routes/plans.routes.js +19 -0
  62. package/dist/routes/plans.routes.js.map +1 -0
  63. package/dist/routes/settings.routes.d.ts +3 -0
  64. package/dist/routes/settings.routes.d.ts.map +1 -0
  65. package/dist/routes/settings.routes.js +29 -0
  66. package/dist/routes/settings.routes.js.map +1 -0
  67. package/dist/routes/workspace.routes.d.ts +3 -0
  68. package/dist/routes/workspace.routes.d.ts.map +1 -0
  69. package/dist/routes/workspace.routes.js +28 -0
  70. package/dist/routes/workspace.routes.js.map +1 -0
  71. package/dist/services/auth.service.d.ts +32 -0
  72. package/dist/services/auth.service.d.ts.map +1 -0
  73. package/dist/services/auth.service.js +110 -0
  74. package/dist/services/auth.service.js.map +1 -0
  75. package/dist/services/data.service.d.ts +47 -0
  76. package/dist/services/data.service.d.ts.map +1 -0
  77. package/dist/services/data.service.js +139 -0
  78. package/dist/services/data.service.js.map +1 -0
  79. package/dist/services/email.service.d.ts +23 -0
  80. package/dist/services/email.service.d.ts.map +1 -0
  81. package/dist/services/email.service.js +316 -0
  82. package/dist/services/email.service.js.map +1 -0
  83. package/dist/services/notify.service.d.ts +2 -0
  84. package/dist/services/notify.service.d.ts.map +1 -0
  85. package/dist/services/notify.service.js +21 -0
  86. package/dist/services/notify.service.js.map +1 -0
  87. package/dist/services/plan.service.d.ts +21 -0
  88. package/dist/services/plan.service.d.ts.map +1 -0
  89. package/dist/services/plan.service.js +96 -0
  90. package/dist/services/plan.service.js.map +1 -0
  91. package/dist/services/resource.service.d.ts +27 -0
  92. package/dist/services/resource.service.d.ts.map +1 -0
  93. package/dist/services/resource.service.js +150 -0
  94. package/dist/services/resource.service.js.map +1 -0
  95. package/dist/services/settings.service.d.ts +41 -0
  96. package/dist/services/settings.service.d.ts.map +1 -0
  97. package/dist/services/settings.service.js +254 -0
  98. package/dist/services/settings.service.js.map +1 -0
  99. package/dist/services/sobriety.service.d.ts +41 -0
  100. package/dist/services/sobriety.service.d.ts.map +1 -0
  101. package/dist/services/sobriety.service.js +243 -0
  102. package/dist/services/sobriety.service.js.map +1 -0
  103. package/dist/services/workspace.service.d.ts +71 -0
  104. package/dist/services/workspace.service.d.ts.map +1 -0
  105. package/dist/services/workspace.service.js +265 -0
  106. package/dist/services/workspace.service.js.map +1 -0
  107. package/dist/tools/chat-tools.d.ts +2 -0
  108. package/dist/tools/chat-tools.d.ts.map +1 -0
  109. package/dist/tools/chat-tools.js +419 -0
  110. package/dist/tools/chat-tools.js.map +1 -0
  111. package/dist/tools/index.d.ts +19 -0
  112. package/dist/tools/index.d.ts.map +1 -0
  113. package/dist/tools/index.js +27 -0
  114. package/dist/tools/index.js.map +1 -0
  115. package/package.json +38 -0
  116. package/public/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  117. package/public/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  118. package/public/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  119. package/public/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  120. package/public/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  121. package/public/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  122. package/public/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  123. package/public/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  124. package/public/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  125. package/public/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  126. package/public/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  127. package/public/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  128. package/public/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  129. package/public/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  130. package/public/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  131. package/public/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  132. package/public/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  133. package/public/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  134. package/public/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  135. package/public/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  136. package/public/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  137. package/public/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  138. package/public/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  139. package/public/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  140. package/public/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  141. package/public/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  142. package/public/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  143. package/public/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  144. package/public/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  145. package/public/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  146. package/public/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  147. package/public/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  148. package/public/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  149. package/public/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  150. package/public/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  151. package/public/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  152. package/public/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  153. package/public/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  154. package/public/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  155. package/public/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  156. package/public/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  157. package/public/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  158. package/public/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  159. package/public/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  160. package/public/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  161. package/public/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  162. package/public/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  163. package/public/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  164. package/public/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  165. package/public/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  166. package/public/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  167. package/public/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  168. package/public/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  169. package/public/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  170. package/public/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  171. package/public/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  172. package/public/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  173. package/public/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  174. package/public/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  175. package/public/assets/_baseUniq-DiHtXYsr.js +1 -0
  176. package/public/assets/arc-Bv1zbXf7.js +1 -0
  177. package/public/assets/architectureDiagram-Q4EWVU46-EbiUvXBr.js +36 -0
  178. package/public/assets/blockDiagram-DXYQGD6D-B-4wwQNT.js +132 -0
  179. package/public/assets/c4Diagram-AHTNJAMY-brLyKMPJ.js +10 -0
  180. package/public/assets/channel-Me4d6Y1x.js +1 -0
  181. package/public/assets/chunk-4BX2VUAB-DMh-4Nye.js +1 -0
  182. package/public/assets/chunk-4TB4RGXK-CSr1z2CQ.js +206 -0
  183. package/public/assets/chunk-55IACEB6-xN0xmcvD.js +1 -0
  184. package/public/assets/chunk-EDXVE4YY-CkCM3j5E.js +1 -0
  185. package/public/assets/chunk-FMBD7UC4-B-mDgsjM.js +15 -0
  186. package/public/assets/chunk-OYMX7WX6-DK8dg9K4.js +231 -0
  187. package/public/assets/chunk-QZHKN3VN-BZGbFOdK.js +1 -0
  188. package/public/assets/chunk-YZCP3GAM-BTmFmMer.js +1 -0
  189. package/public/assets/classDiagram-6PBFFD2Q-BXgAb5m4.js +1 -0
  190. package/public/assets/classDiagram-v2-HSJHXN6E-BXgAb5m4.js +1 -0
  191. package/public/assets/clone-rnECnpTI.js +1 -0
  192. package/public/assets/cose-bilkent-S5V4N54A-BBqCwo63.js +1 -0
  193. package/public/assets/cytoscape.esm-BQk4lpUV.js +331 -0
  194. package/public/assets/dagre-KV5264BT-DLeQYvAA.js +4 -0
  195. package/public/assets/defaultLocale-DX6XiGOO.js +1 -0
  196. package/public/assets/diagram-5BDNPKRD-D85z2LaM.js +10 -0
  197. package/public/assets/diagram-G4DWMVQ6-4AvBmvcP.js +24 -0
  198. package/public/assets/diagram-MMDJMWI5-DRNEGNZA.js +43 -0
  199. package/public/assets/diagram-TYMM5635-C_oGwrmX.js +24 -0
  200. package/public/assets/erDiagram-SMLLAGMA-DDSp8ANa.js +85 -0
  201. package/public/assets/flowDiagram-DWJPFMVM-B1Wy36da.js +162 -0
  202. package/public/assets/ganttDiagram-T4ZO3ILL-CQ7VWheo.js +292 -0
  203. package/public/assets/gitGraphDiagram-UUTBAWPF-BhvM7s41.js +106 -0
  204. package/public/assets/graph-fatjTp1h.js +1 -0
  205. package/public/assets/index-1PrEnCZL.js +677 -0
  206. package/public/assets/index-DcsnItNp.css +1 -0
  207. package/public/assets/infoDiagram-42DDH7IO-4eawOC2G.js +2 -0
  208. package/public/assets/init-Gi6I4Gst.js +1 -0
  209. package/public/assets/ishikawaDiagram-UXIWVN3A-CJWfG1fv.js +70 -0
  210. package/public/assets/journeyDiagram-VCZTEJTY-C4Zx3dpF.js +139 -0
  211. package/public/assets/kanban-definition-6JOO6SKY-CV1vDcC8.js +89 -0
  212. package/public/assets/layout-CX0IDv3q.js +1 -0
  213. package/public/assets/linear-C8hMcu9f.js +1 -0
  214. package/public/assets/min-BaxMGW9J.js +1 -0
  215. package/public/assets/mindmap-definition-QFDTVHPH-KzGyX4Em.js +96 -0
  216. package/public/assets/ordinal-Cboi1Yqb.js +1 -0
  217. package/public/assets/pieDiagram-DEJITSTG-Dp2x5kvP.js +30 -0
  218. package/public/assets/quadrantDiagram-34T5L4WZ-B4yqA6XF.js +7 -0
  219. package/public/assets/requirementDiagram-MS252O5E-DEjN_2tG.js +84 -0
  220. package/public/assets/sankeyDiagram-XADWPNL6-BKm_F5FA.js +10 -0
  221. package/public/assets/sequenceDiagram-FGHM5R23-07BCMKjW.js +157 -0
  222. package/public/assets/stateDiagram-FHFEXIEX-DVz6GtR8.js +1 -0
  223. package/public/assets/stateDiagram-v2-QKLJ7IA2-DYiYr0PB.js +1 -0
  224. package/public/assets/timeline-definition-GMOUNBTQ-C0u67FqY.js +120 -0
  225. package/public/assets/vennDiagram-DHZGUBPP-BiAlMVLe.js +34 -0
  226. package/public/assets/wardley-RL74JXVD-BnWyuHzf.js +162 -0
  227. package/public/assets/wardleyDiagram-NUSXRM2D-DEL2Lx6S.js +20 -0
  228. package/public/assets/xychartDiagram-5P7HB3ND-ILdmj7ok.js +7 -0
  229. package/public/index.html +17 -0
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const uuid_1 = require("uuid");
5
+ const auth_service_1 = require("../services/auth.service");
6
+ const auth_middleware_1 = require("../middleware/auth.middleware");
7
+ const database_1 = require("../database");
8
+ const router = (0, express_1.Router)();
9
+ // POST /api/auth/login
10
+ router.post('/login', (req, res) => {
11
+ const { syncToken } = req.body;
12
+ if (!syncToken?.trim()) {
13
+ res.status(400).json({ success: false, error: '请输入访问码' });
14
+ return;
15
+ }
16
+ res.json((0, auth_service_1.loginByToken)(syncToken.trim()));
17
+ });
18
+ // GET /api/auth/me
19
+ router.get('/me', auth_middleware_1.requireAuth, (req, res) => {
20
+ const user = (0, auth_service_1.getUserBySyncToken)(req.headers['x-sync-token'] || '');
21
+ res.json({ success: true, data: user });
22
+ });
23
+ // POST /api/auth/setup — 监护人初始配置(设置名字)
24
+ router.post('/setup', auth_middleware_1.requireAuth, (req, res) => {
25
+ const { guardianName } = req.body;
26
+ if (!guardianName?.trim()) {
27
+ res.status(400).json({ success: false, error: '请填写称呼' });
28
+ return;
29
+ }
30
+ (0, auth_service_1.setupGuardian)(req.userId, guardianName);
31
+ res.json({ success: true });
32
+ });
33
+ // GET /api/auth/students — 列出名下学生
34
+ router.get('/students', auth_middleware_1.requireAuth, (req, res) => {
35
+ const students = (0, auth_service_1.listStudents)(req.userId);
36
+ res.json({ success: true, data: students });
37
+ });
38
+ // POST /api/auth/students — 创建学生账户
39
+ router.post('/students', auth_middleware_1.requireAuth, (req, res) => {
40
+ const { name, grade, subjects } = req.body;
41
+ if (!name?.trim()) {
42
+ res.status(400).json({ success: false, error: '请填写学生姓名' });
43
+ return;
44
+ }
45
+ const student = (0, auth_service_1.createStudent)(req.userId, name, grade);
46
+ if (Array.isArray(subjects) && subjects.length > 0) {
47
+ const db = (0, database_1.getDB)();
48
+ const now = Date.now();
49
+ db.prepare(`
50
+ INSERT INTO Plan (id, student_id, title, description, subjects, status, create_time, update_time, delete_flag)
51
+ VALUES (?, ?, ?, '', ?, 'active', ?, ?, 0)
52
+ `).run((0, uuid_1.v4)(), student.id, `${student.name}的学习计划`, JSON.stringify(subjects), now, now);
53
+ }
54
+ res.json({ success: true, data: student });
55
+ });
56
+ // DELETE /api/auth/students/:id
57
+ router.delete('/students/:id', auth_middleware_1.requireAuth, (req, res) => {
58
+ const ok = (0, auth_service_1.deleteStudent)(req.params.id, req.userId);
59
+ res.json({ success: ok, error: ok ? undefined : '操作失败或无权限' });
60
+ });
61
+ // POST /api/auth/reset-token
62
+ router.post('/reset-token', auth_middleware_1.requireAuth, (req, res) => {
63
+ res.json((0, auth_service_1.resetSyncToken)(req.userId));
64
+ });
65
+ exports.default = router;
66
+ //# sourceMappingURL=auth.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.routes.js","sourceRoot":"","sources":["../../src/routes/auth.routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=chat.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.routes.d.ts","sourceRoot":"","sources":["../../src/routes/chat.routes.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAwDvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = require("express");
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const agent_1 = require("../agent");
9
+ const auth_middleware_1 = require("../middleware/auth.middleware");
10
+ function touchActivity() {
11
+ const f = process.env.NOTIFY_FILE;
12
+ if (!f)
13
+ return;
14
+ try {
15
+ fs_1.default.writeFileSync(f, JSON.stringify({ lastActivity: Date.now() }));
16
+ }
17
+ catch { /* ignore */ }
18
+ }
19
+ const router = (0, express_1.Router)();
20
+ router.use(auth_middleware_1.requireAuth);
21
+ router.post('/send', async (req, res) => {
22
+ const { message } = req.body;
23
+ if (!message?.trim()) {
24
+ res.status(400).json({ success: false, error: '消息不能为空' });
25
+ return;
26
+ }
27
+ const engine = (0, agent_1.getAgentEngine)();
28
+ if (!engine) {
29
+ res.json({ success: false, error: 'AI 引擎未初始化' });
30
+ return;
31
+ }
32
+ try {
33
+ const response = await engine.generateBotResponse(req.userId, message.trim());
34
+ res.json({ success: true, data: response || '(AI 暂无回复)' });
35
+ }
36
+ catch (err) {
37
+ res.json({ success: false, error: err instanceof Error ? err.message : String(err) });
38
+ }
39
+ });
40
+ router.post('/stream', async (req, res) => {
41
+ const { messages } = req.body;
42
+ if (!Array.isArray(messages) || messages.length === 0) {
43
+ res.status(400).json({ success: false, error: '消息不能为空' });
44
+ return;
45
+ }
46
+ const engine = (0, agent_1.getAgentEngine)();
47
+ if (!engine) {
48
+ res.status(503).json({ success: false, error: 'AI 引擎未初始化' });
49
+ return;
50
+ }
51
+ touchActivity();
52
+ res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');
53
+ res.setHeader('Cache-Control', 'no-cache');
54
+ res.setHeader('Connection', 'keep-alive');
55
+ res.setHeader('X-Accel-Buffering', 'no');
56
+ res.flushHeaders();
57
+ const send = (obj) => {
58
+ if (!res.writableEnded)
59
+ res.write(`data: ${JSON.stringify(obj)}\n\n`);
60
+ };
61
+ try {
62
+ await engine.streamChatResponse(req.userId, messages, (token) => send({ token }), () => { if (!res.writableEnded) {
63
+ res.write('data: [DONE]\n\n');
64
+ res.end();
65
+ } }, (err) => { send({ error: err }); if (!res.writableEnded)
66
+ res.end(); }, (toolName, display) => {
67
+ if (toolName === 'thinking')
68
+ send({ thinking: display }); // reasoning model token
69
+ else
70
+ send({ tool: toolName, display }); // tool call indicator
71
+ });
72
+ }
73
+ catch (err) {
74
+ send({ error: err instanceof Error ? err.message : String(err) });
75
+ if (!res.writableEnded)
76
+ res.end();
77
+ }
78
+ });
79
+ exports.default = router;
80
+ //# sourceMappingURL=chat.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.routes.js","sourceRoot":"","sources":["../../src/routes/chat.routes.ts"],"names":[],"mappings":";;;;;AAAA,qCAAgC;AAChC,4CAAmB;AACnB,oCAAyC;AACzC,mEAAwE;AAExE,SAAS,aAAa;IACpB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;IACjC,IAAI,CAAC,CAAC;QAAE,OAAM;IACd,IAAI,CAAC;QAAC,YAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IACnD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAA2B,CAAA;IACnD,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAC3F,MAAM,MAAM,GAAG,IAAA,sBAAc,GAAE,CAAA;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAC9E,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAA;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACvF,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IACrD,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAExB,CAAA;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,OAAM;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,sBAAc,GAAE,CAAA;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAAC,OAAM;IAAC,CAAC;IAErF,aAAa,EAAE,CAAA;IAEf,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kCAAkC,CAAC,CAAA;IACjE,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;IAC1C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IACzC,GAAG,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAA;IACxC,GAAG,CAAC,YAAY,EAAE,CAAA;IAElB,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACvE,CAAC,CAAA;IAED,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,CAC7B,GAAG,CAAC,MAAO,EACX,QAAQ,EACR,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAC1B,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAAC,GAAG,CAAC,GAAG,EAAE,CAAA;QAAC,CAAC,CAAC,CAAC,EAC9E,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,EAAE,CAAA,CAAC,CAAC,EACpE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;YACpB,IAAI,QAAQ,KAAK,UAAU;gBAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA,CAAG,wBAAwB;;gBAC9E,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA,CAAsB,sBAAsB;QACpF,CAAC,CACF,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,GAAG,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,EAAE,CAAA;IACnC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=data.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.routes.d.ts","sourceRoot":"","sources":["../../src/routes/data.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAYvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const data_service_1 = require("../services/data.service");
5
+ const auth_middleware_1 = require("../middleware/auth.middleware");
6
+ const router = (0, express_1.Router)();
7
+ router.use(auth_middleware_1.requireAuth);
8
+ router.post('/learning', async (req, res) => {
9
+ res.json(await (0, data_service_1.recordLearning)({ ...req.body, studentId: req.userId }));
10
+ });
11
+ router.get('/summary', (req, res) => {
12
+ const { dateFrom, dateTo, subject } = req.query;
13
+ res.json((0, data_service_1.getSummary)(req.userId, Number(dateFrom), Number(dateTo), subject));
14
+ });
15
+ exports.default = router;
16
+ //# sourceMappingURL=data.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.routes.js","sourceRoot":"","sources":["../../src/routes/data.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,2DAAwF;AACxF,mEAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IACvD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,6BAAc,EAAC,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AACxE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,KAA+B,CAAA;IACzE,GAAG,CAAC,IAAI,CAAC,IAAA,yBAAe,EAAC,GAAG,CAAC,MAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;AACnF,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=email.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.routes.d.ts","sourceRoot":"","sources":["../../src/routes/email.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAevB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const email_service_1 = require("../services/email.service");
5
+ const auth_middleware_1 = require("../middleware/auth.middleware");
6
+ const router = (0, express_1.Router)();
7
+ router.use(auth_middleware_1.requireAuth);
8
+ router.get('/status', (_req, res) => {
9
+ res.json(email_service_1.emailService.getStatus());
10
+ });
11
+ router.post('/start', async (_req, res) => {
12
+ res.json(await email_service_1.emailService.startPolling());
13
+ });
14
+ router.post('/stop', (_req, res) => {
15
+ res.json(email_service_1.emailService.stopPolling());
16
+ });
17
+ exports.default = router;
18
+ //# sourceMappingURL=email.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.routes.js","sourceRoot":"","sources":["../../src/routes/email.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,6DAAwD;AACxD,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAClC,GAAG,CAAC,IAAI,CAAC,4BAAY,CAAC,SAAS,EAAE,CAAC,CAAA;AACpC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,4BAAY,CAAC,WAAW,EAAE,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=goals.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goals.routes.d.ts","sourceRoot":"","sources":["../../src/routes/goals.routes.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA+CvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const uuid_1 = require("uuid");
5
+ const database_1 = require("../database");
6
+ const auth_middleware_1 = require("../middleware/auth.middleware");
7
+ const auth_service_1 = require("../services/auth.service");
8
+ const router = (0, express_1.Router)();
9
+ router.use(auth_middleware_1.requireAuth);
10
+ function resolveStudentId(userId) {
11
+ const db = (0, database_1.getDB)();
12
+ const user = db.prepare('SELECT role FROM User WHERE id=? AND delete_flag=0').get(userId);
13
+ if (user?.role === 'guardian')
14
+ return (0, auth_service_1.getPrimaryStudentId)(userId) ?? userId;
15
+ return userId;
16
+ }
17
+ // GET /api/goals — 获取当前学生目标
18
+ router.get('/', (req, res) => {
19
+ const studentId = resolveStudentId(req.userId);
20
+ const db = (0, database_1.getDB)();
21
+ const goal = db.prepare(`SELECT * FROM StudentGoal WHERE student_id=? AND delete_flag=0 ORDER BY update_time DESC LIMIT 1`).get(studentId);
22
+ res.json({ success: true, data: goal ?? null });
23
+ });
24
+ // POST /api/goals — 创建或更新目标
25
+ router.post('/', (req, res) => {
26
+ const { examType, examDate, schoolProgress, guardianNotes } = req.body;
27
+ const studentId = resolveStudentId(req.userId);
28
+ const db = (0, database_1.getDB)();
29
+ const now = Date.now();
30
+ const existing = db.prepare(`SELECT id FROM StudentGoal WHERE student_id=? AND delete_flag=0 ORDER BY update_time DESC LIMIT 1`).get(studentId);
31
+ if (existing) {
32
+ db.prepare(`
33
+ UPDATE StudentGoal SET exam_type=?, exam_date=?, school_progress=?, guardian_notes=?, update_time=? WHERE id=?
34
+ `).run(examType ?? null, examDate ?? null, schoolProgress ?? null, guardianNotes ?? null, now, existing.id);
35
+ }
36
+ else {
37
+ db.prepare(`
38
+ INSERT INTO StudentGoal (id, student_id, exam_type, exam_date, school_progress, guardian_notes, create_time, update_time, delete_flag)
39
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0)
40
+ `).run((0, uuid_1.v4)(), studentId, examType ?? null, examDate ?? null, schoolProgress ?? null, guardianNotes ?? null, now, now);
41
+ }
42
+ res.json({ success: true });
43
+ });
44
+ exports.default = router;
45
+ //# sourceMappingURL=goals.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goals.routes.js","sourceRoot":"","sources":["../../src/routes/goals.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,+BAAmC;AACnC,0CAAmC;AACnC,mEAAwE;AACxE,2DAA8D;AAE9D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAiC,CAAA;IACzH,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU;QAAE,OAAO,IAAA,kCAAmB,EAAC,MAAM,CAAC,IAAI,MAAM,CAAA;IAC3E,OAAO,MAAM,CAAA;AACf,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACxC,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAO,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,kGAAkG,CACnG,CAAC,GAAG,CAAC,SAAS,CAAwC,CAAA;IACvD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC,CAAC,CAAA;AAEF,4BAA4B;AAC5B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC,IAEjE,CAAA;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAO,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEtB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,mGAAmG,CACpG,CAAC,GAAG,CAAC,SAAS,CAA+B,CAAA;IAE9C,IAAI,QAAQ,EAAE,CAAC;QACb,EAAE,CAAC,OAAO,CAAC;;KAEV,CAAC,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC7G,CAAC;SAAM,CAAC;QACN,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,cAAc,IAAI,IAAI,EAAE,aAAa,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAC1H,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=plans.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.routes.d.ts","sourceRoot":"","sources":["../../src/routes/plans.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AAgBvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const plan_service_1 = require("../services/plan.service");
5
+ const auth_middleware_1 = require("../middleware/auth.middleware");
6
+ const router = (0, express_1.Router)();
7
+ router.use(auth_middleware_1.requireAuth);
8
+ router.post('/', async (req, res) => {
9
+ const { title, description, subjects } = req.body;
10
+ res.json(await (0, plan_service_1.create)(req.userId, title, description, subjects));
11
+ });
12
+ router.get('/active', (req, res) => {
13
+ res.json((0, plan_service_1.getActive)(req.userId));
14
+ });
15
+ router.get('/', (req, res) => {
16
+ res.json((0, plan_service_1.listPlans)(req.userId));
17
+ });
18
+ exports.default = router;
19
+ //# sourceMappingURL=plans.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plans.routes.js","sourceRoot":"","sources":["../../src/routes/plans.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,2DAAsG;AACtG,mEAAwE;AAExE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC/C,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACjD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,qBAAU,EAAC,GAAG,CAAC,MAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IAC9C,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAa,EAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAgB,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,IAAA,wBAAS,EAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAA;AAClC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=settings.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.routes.d.ts","sourceRoot":"","sources":["../../src/routes/settings.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA6BvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const settings_service_1 = require("../services/settings.service");
5
+ const auth_middleware_1 = require("../middleware/auth.middleware");
6
+ const router = (0, express_1.Router)();
7
+ router.use(auth_middleware_1.requireAuth);
8
+ router.get('/models', async (_req, res) => {
9
+ res.json(await (0, settings_service_1.getModels)());
10
+ });
11
+ router.post('/ai', async (req, res) => {
12
+ const { provider, modelId, modelName, apiKey, baseUrl } = req.body;
13
+ res.json((0, settings_service_1.saveAIConfig)(provider, modelId, modelName, apiKey, baseUrl));
14
+ });
15
+ router.get('/ai', (_req, res) => {
16
+ res.json((0, settings_service_1.getAIConfig)());
17
+ });
18
+ router.post('/email', async (req, res) => {
19
+ const { email, authCode, imapHost, imapPort } = req.body;
20
+ res.json(await (0, settings_service_1.saveEmailConfig)(email, authCode, imapHost, Number(imapPort)));
21
+ });
22
+ router.get('/email', (_req, res) => {
23
+ res.json((0, settings_service_1.getEmailConfig)());
24
+ });
25
+ router.post('/email/test', async (_req, res) => {
26
+ res.json(await (0, settings_service_1.testEmailConnection)());
27
+ });
28
+ exports.default = router;
29
+ //# sourceMappingURL=settings.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.routes.js","sourceRoot":"","sources":["../../src/routes/settings.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,mEAAyI;AACzI,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACxC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,4BAAS,GAAE,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACpC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAClE,GAAG,CAAC,IAAI,CAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IAC9B,GAAG,CAAC,IAAI,CAAC,IAAA,8BAAW,GAAE,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IACxD,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,kCAAe,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC9E,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,IAAA,iCAAc,GAAE,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC7C,GAAG,CAAC,IAAI,CAAC,MAAM,IAAA,sCAAmB,GAAE,CAAC,CAAA;AACvC,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=workspace.routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.routes.d.ts","sourceRoot":"","sources":["../../src/routes/workspace.routes.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAA;AA4BvB,eAAe,MAAM,CAAA"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const express_1 = require("express");
4
+ const workspace_service_1 = require("../services/workspace.service");
5
+ const auth_middleware_1 = require("../middleware/auth.middleware");
6
+ const router = (0, express_1.Router)();
7
+ router.use(auth_middleware_1.requireAuth);
8
+ router.post('/write', async (req, res) => {
9
+ const { relativePath, content } = req.body;
10
+ res.json(await workspace_service_1.workspaceService.write(relativePath, content));
11
+ });
12
+ router.get('/read', async (req, res) => {
13
+ res.json(await workspace_service_1.workspaceService.read(req.query.path));
14
+ });
15
+ router.get('/list', async (req, res) => {
16
+ res.json(await workspace_service_1.workspaceService.list(req.query.path || ''));
17
+ });
18
+ router.delete('/delete', async (req, res) => {
19
+ res.json(await workspace_service_1.workspaceService.delete(req.query.path));
20
+ });
21
+ router.get('/stats', async (_req, res) => {
22
+ res.json(await workspace_service_1.workspaceService.getStats());
23
+ });
24
+ router.post('/cleanup-temp', async (_req, res) => {
25
+ res.json(await workspace_service_1.workspaceService.cleanupTemp());
26
+ });
27
+ exports.default = router;
28
+ //# sourceMappingURL=workspace.routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.routes.js","sourceRoot":"","sources":["../../src/routes/workspace.routes.ts"],"names":[],"mappings":";;AAAA,qCAAgC;AAChC,qEAAgE;AAChE,mEAA2D;AAE3D,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAA;AACvB,MAAM,CAAC,GAAG,CAAC,6BAAW,CAAC,CAAA;AAEvB,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,CAAA;IAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAA;AAC/D,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC,CAAA;AACjE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACrC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,IAAI,EAAE,CAAC,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC1C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACvC,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/C,GAAG,CAAC,IAAI,CAAC,MAAM,oCAAgB,CAAC,WAAW,EAAE,CAAC,CAAA;AAChD,CAAC,CAAC,CAAA;AAEF,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,32 @@
1
+ export interface UserInfo {
2
+ id: string;
3
+ displayName: string | null;
4
+ role: string;
5
+ studentName: string | null;
6
+ studentGrade: string | null;
7
+ guardianId: string | null;
8
+ }
9
+ export interface StudentRecord {
10
+ id: string;
11
+ name: string;
12
+ grade: string | null;
13
+ token: string;
14
+ }
15
+ export interface LoginResult {
16
+ success: boolean;
17
+ user?: UserInfo;
18
+ syncToken?: string;
19
+ error?: string;
20
+ }
21
+ export declare function ensureAdminAccount(): {
22
+ syncToken: string;
23
+ };
24
+ export declare function loginByToken(syncToken: string): LoginResult;
25
+ export declare function getUserBySyncToken(syncToken: string): UserInfo | null;
26
+ export declare function setupGuardian(userId: string, guardianName: string): void;
27
+ export declare function createStudent(guardianId: string, name: string, grade?: string): StudentRecord;
28
+ export declare function listStudents(guardianId: string): StudentRecord[];
29
+ export declare function deleteStudent(studentId: string, guardianId: string): boolean;
30
+ export declare function resetSyncToken(userId: string): LoginResult;
31
+ export declare function getPrimaryStudentId(guardianId: string): string | null;
32
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,kBAAkB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAiB1D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAuB3D;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAkBrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAIxE;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAU7F;AAGD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,EAAE,CAOhE;AAGD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAM5E;AAGD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAO1D;AAGD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrE"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureAdminAccount = ensureAdminAccount;
4
+ exports.loginByToken = loginByToken;
5
+ exports.getUserBySyncToken = getUserBySyncToken;
6
+ exports.setupGuardian = setupGuardian;
7
+ exports.createStudent = createStudent;
8
+ exports.listStudents = listStudents;
9
+ exports.deleteStudent = deleteStudent;
10
+ exports.resetSyncToken = resetSyncToken;
11
+ exports.getPrimaryStudentId = getPrimaryStudentId;
12
+ const uuid_1 = require("uuid");
13
+ const database_1 = require("../database");
14
+ function ensureAdminAccount() {
15
+ const db = (0, database_1.getDB)();
16
+ const existing = db
17
+ .prepare("SELECT id, sync_token FROM User WHERE username = 'admin' AND delete_flag = 0")
18
+ .get();
19
+ if (existing)
20
+ return { syncToken: existing.sync_token };
21
+ const syncToken = (0, uuid_1.v4)();
22
+ const now = Date.now();
23
+ db.prepare(`
24
+ INSERT INTO User (id, username, sync_token, role, create_time, update_time, delete_flag)
25
+ VALUES (?, 'admin', ?, 'guardian', ?, ?, 0)
26
+ `).run((0, uuid_1.v4)(), syncToken, now, now);
27
+ console.log('[Auth] Created admin account');
28
+ return { syncToken };
29
+ }
30
+ function loginByToken(syncToken) {
31
+ const db = (0, database_1.getDB)();
32
+ const user = db
33
+ .prepare('SELECT id, display_name, role, student_name, student_grade, guardian_id FROM User WHERE sync_token = ? AND delete_flag = 0')
34
+ .get(syncToken);
35
+ if (!user)
36
+ return { success: false, error: '访问码错误' };
37
+ return {
38
+ success: true,
39
+ syncToken,
40
+ user: {
41
+ id: user.id,
42
+ displayName: user.display_name ?? null,
43
+ role: user.role ?? 'guardian',
44
+ studentName: user.student_name ?? null,
45
+ studentGrade: user.student_grade ?? null,
46
+ guardianId: user.guardian_id ?? null
47
+ }
48
+ };
49
+ }
50
+ function getUserBySyncToken(syncToken) {
51
+ const db = (0, database_1.getDB)();
52
+ const user = db
53
+ .prepare('SELECT id, display_name, role, student_name, student_grade, guardian_id FROM User WHERE sync_token = ? AND delete_flag = 0')
54
+ .get(syncToken);
55
+ if (!user)
56
+ return null;
57
+ return {
58
+ id: user.id,
59
+ displayName: user.display_name ?? null,
60
+ role: user.role ?? 'guardian',
61
+ studentName: user.student_name ?? null,
62
+ studentGrade: user.student_grade ?? null,
63
+ guardianId: user.guardian_id ?? null
64
+ };
65
+ }
66
+ function setupGuardian(userId, guardianName) {
67
+ const db = (0, database_1.getDB)();
68
+ db.prepare('UPDATE User SET display_name = ?, update_time = ? WHERE id = ?')
69
+ .run(guardianName.trim(), Date.now(), userId);
70
+ }
71
+ // 创建学生账户,绑定到监护人
72
+ function createStudent(guardianId, name, grade) {
73
+ const db = (0, database_1.getDB)();
74
+ const id = (0, uuid_1.v4)();
75
+ const token = (0, uuid_1.v4)();
76
+ const now = Date.now();
77
+ db.prepare(`
78
+ INSERT INTO User (id, username, sync_token, display_name, role, guardian_id, student_grade, create_time, update_time, delete_flag)
79
+ VALUES (?, ?, ?, ?, 'student', ?, ?, ?, ?, 0)
80
+ `).run(id, `student_${id.slice(0, 8)}`, token, name.trim(), guardianId, grade ?? null, now, now);
81
+ return { id, name: name.trim(), grade: grade ?? null, token };
82
+ }
83
+ // 列出监护人名下所有学生
84
+ function listStudents(guardianId) {
85
+ const db = (0, database_1.getDB)();
86
+ return db.prepare('SELECT id, display_name, student_grade, sync_token FROM User WHERE guardian_id = ? AND role = ? AND delete_flag = 0 ORDER BY create_time ASC').all(guardianId, 'student').map(r => ({ id: r.id, name: r.display_name, grade: r.student_grade, token: r.sync_token }));
87
+ }
88
+ // 删除(软删)学生账户
89
+ function deleteStudent(studentId, guardianId) {
90
+ const db = (0, database_1.getDB)();
91
+ const result = db.prepare('UPDATE User SET delete_flag = 1, update_time = ? WHERE id = ? AND guardian_id = ?').run(Date.now(), studentId, guardianId);
92
+ return result.changes > 0;
93
+ }
94
+ // 重置 syncToken
95
+ function resetSyncToken(userId) {
96
+ const db = (0, database_1.getDB)();
97
+ const user = db.prepare('SELECT id FROM User WHERE id = ? AND delete_flag = 0').get(userId);
98
+ if (!user)
99
+ return { success: false, error: '用户不存在' };
100
+ const newToken = (0, uuid_1.v4)();
101
+ db.prepare('UPDATE User SET sync_token = ?, update_time = ? WHERE id = ?').run(newToken, Date.now(), user.id);
102
+ return { success: true, syncToken: newToken };
103
+ }
104
+ // 获取监护人名下第一个学生的 ID(工具调用时用)
105
+ function getPrimaryStudentId(guardianId) {
106
+ const db = (0, database_1.getDB)();
107
+ const row = db.prepare('SELECT id FROM User WHERE guardian_id = ? AND role = ? AND delete_flag = 0 ORDER BY create_time ASC LIMIT 1').get(guardianId, 'student');
108
+ return row?.id ?? null;
109
+ }
110
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":";;AA0BA,gDAiBC;AAED,oCAuBC;AAED,gDAkBC;AAED,sCAIC;AAGD,sCAUC;AAGD,oCAOC;AAGD,sCAMC;AAGD,wCAOC;AAGD,kDAMC;AAjJD,+BAAmC;AACnC,0CAAmC;AAyBnC,SAAgB,kBAAkB;IAChC,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,QAAQ,GAAG,EAAE;SAChB,OAAO,CAAC,8EAA8E,CAAC;SACvF,GAAG,EAAoD,CAAA;IAE1D,IAAI,QAAQ;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAA;IAEvD,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAA;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,IAAA,SAAM,GAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAErC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IAC3C,OAAO,EAAE,SAAS,EAAE,CAAA;AACtB,CAAC;AAED,SAAgB,YAAY,CAAC,SAAiB;IAC5C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,4HAA4H,CAAC;SACrI,GAAG,CAAC,SAAS,CAGD,CAAA;IAEf,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IAEpD,OAAO;QACL,OAAO,EAAE,IAAI;QACb,SAAS;QACT,IAAI,EAAE;YACJ,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;YACtC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU;YAC7B,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;YACtC,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;YACxC,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;SACrC;KACF,CAAA;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,SAAiB;IAClD,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,4HAA4H,CAAC;SACrI,GAAG,CAAC,SAAS,CAGD,CAAA;IAEf,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACtC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU;QAC7B,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;QACtC,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;QACxC,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;KACrC,CAAA;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc,EAAE,YAAoB;IAChE,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC;SACzE,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAA;AACjD,CAAC;AAED,gBAAgB;AAChB,SAAgB,aAAa,CAAC,UAAkB,EAAE,IAAY,EAAE,KAAc;IAC5E,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,EAAE,GAAG,IAAA,SAAM,GAAE,CAAA;IACnB,MAAM,KAAK,GAAG,IAAA,SAAM,GAAE,CAAA;IACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACtB,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IAChG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,EAAE,CAAA;AAC/D,CAAC;AAED,cAAc;AACd,SAAgB,YAAY,CAAC,UAAkB;IAC7C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,OAAQ,EAAE,CAAC,OAAO,CAChB,8IAA8I,CAC/I,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAExB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;AACjG,CAAC;AAED,aAAa;AACb,SAAgB,aAAa,CAAC,SAAiB,EAAE,UAAkB;IACjE,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,mFAAmF,CACpF,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;IACxC,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED,eAAe;AACf,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,MAAM,CAA+B,CAAA;IACzH,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAA,SAAM,GAAE,CAAA;IACzB,EAAE,CAAC,OAAO,CAAC,8DAA8D,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IAC7G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AAC/C,CAAC;AAED,2BAA2B;AAC3B,SAAgB,mBAAmB,CAAC,UAAkB;IACpD,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;IAClB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,6GAA6G,CAC9G,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAA+B,CAAA;IAC1D,OAAO,GAAG,EAAE,EAAE,IAAI,IAAI,CAAA;AACxB,CAAC"}
@@ -0,0 +1,47 @@
1
+ export interface LearningRecordInput {
2
+ studentId: string;
3
+ subject: string;
4
+ topic: string;
5
+ score?: number;
6
+ durationMinutes?: number;
7
+ note?: string;
8
+ recordDate?: number;
9
+ }
10
+ export interface LearningRecord {
11
+ id: string;
12
+ student_id: string;
13
+ subject: string;
14
+ topic: string;
15
+ score?: number;
16
+ duration_minutes: number;
17
+ note?: string;
18
+ record_date: number;
19
+ create_time: number;
20
+ }
21
+ export interface SummaryData {
22
+ totalSessions: number;
23
+ totalMinutes: number;
24
+ avgScore: number | null;
25
+ bySubject: Array<{
26
+ subject: string;
27
+ sessions: number;
28
+ totalMinutes: number;
29
+ avgScore: number | null;
30
+ }>;
31
+ weakPoints: Array<{
32
+ subject: string;
33
+ topic: string;
34
+ weakness_score: number;
35
+ attempt_count: number;
36
+ }>;
37
+ }
38
+ export interface DataResult {
39
+ success: boolean;
40
+ data?: LearningRecord | SummaryData | {
41
+ message: string;
42
+ };
43
+ error?: string;
44
+ }
45
+ export declare function recordLearning(data: LearningRecordInput): DataResult;
46
+ export declare function getSummary(studentId: string, dateFrom: number, dateTo: number, subject?: string): DataResult;
47
+ //# sourceMappingURL=data.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.service.d.ts","sourceRoot":"","sources":["../../src/services/data.service.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,MAAM,CAAA;IACxB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,KAAK,CAAC;QACf,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KACxB,CAAC,CAAA;IACF,UAAU,EAAE,KAAK,CAAC;QAChB,OAAO,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,cAAc,EAAE,MAAM,CAAA;QACtB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,cAAc,GAAG,WAAW,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,mBAAmB,GAAG,UAAU,CAoEpE;AA+CD,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,UAAU,CAqEZ"}