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,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.create = create;
4
+ exports.getActive = getActive;
5
+ exports.listPlans = listPlans;
6
+ const uuid_1 = require("uuid");
7
+ const database_1 = require("../database");
8
+ const SUPERADMIN_ID = 'superadmin';
9
+ function create(studentId, title, description, subjects) {
10
+ try {
11
+ const db = (0, database_1.getDB)();
12
+ const now = Date.now();
13
+ const sid = studentId || SUPERADMIN_ID;
14
+ // Archive all active plans for this student
15
+ db.prepare(`
16
+ UPDATE Plan SET status = 'archived', update_user = ?, update_time = ?
17
+ WHERE student_id = ? AND status = 'active' AND delete_flag = 0
18
+ `).run(SUPERADMIN_ID, now, sid);
19
+ // Create new active plan
20
+ const planId = (0, uuid_1.v4)();
21
+ const subjectsJson = JSON.stringify(subjects);
22
+ db.prepare(`
23
+ INSERT INTO Plan (id, student_id, title, description, subjects, status, create_user, update_user, create_time, update_time, delete_flag)
24
+ VALUES (?, ?, ?, ?, ?, 'active', ?, ?, ?, ?, 0)
25
+ `).run(planId, sid, title, description || '', subjectsJson, SUPERADMIN_ID, SUPERADMIN_ID, now, now);
26
+ console.log(`Plan created for student ${sid}: ${title}`);
27
+ try {
28
+ const { getAgentEngine } = require('../agent');
29
+ const engine = getAgentEngine();
30
+ if (engine) {
31
+ engine.handleEvent({ type: 'plan_changed', studentId: sid, planId });
32
+ }
33
+ }
34
+ catch {
35
+ // Agent not initialized yet, skip
36
+ }
37
+ const newPlan = {
38
+ id: planId,
39
+ student_id: sid,
40
+ title,
41
+ description: description || '',
42
+ subjects,
43
+ status: 'active',
44
+ create_time: now,
45
+ update_time: now
46
+ };
47
+ return { success: true, data: newPlan };
48
+ }
49
+ catch (err) {
50
+ const error = err instanceof Error ? err.message : String(err);
51
+ console.error('Plan create error:', error);
52
+ return { success: false, error };
53
+ }
54
+ }
55
+ function getActive(studentId) {
56
+ try {
57
+ const db = (0, database_1.getDB)();
58
+ const sid = studentId || SUPERADMIN_ID;
59
+ const row = db
60
+ .prepare("SELECT * FROM Plan WHERE student_id = ? AND status = 'active' AND delete_flag = 0 ORDER BY create_time DESC LIMIT 1")
61
+ .get(sid);
62
+ if (!row) {
63
+ return { success: true, data: undefined };
64
+ }
65
+ const plan = {
66
+ ...row,
67
+ subjects: JSON.parse(row.subjects)
68
+ };
69
+ return { success: true, data: plan };
70
+ }
71
+ catch (err) {
72
+ const error = err instanceof Error ? err.message : String(err);
73
+ console.error('Plan getActive error:', error);
74
+ return { success: false, error };
75
+ }
76
+ }
77
+ function listPlans(studentId) {
78
+ try {
79
+ const db = (0, database_1.getDB)();
80
+ const sid = studentId || SUPERADMIN_ID;
81
+ const rows = db
82
+ .prepare('SELECT * FROM Plan WHERE student_id = ? AND delete_flag = 0 ORDER BY create_time DESC')
83
+ .all(sid);
84
+ const plans = rows.map((row) => ({
85
+ ...row,
86
+ subjects: JSON.parse(row.subjects)
87
+ }));
88
+ return { success: true, data: plans };
89
+ }
90
+ catch (err) {
91
+ const error = err instanceof Error ? err.message : String(err);
92
+ console.error('Plan list error:', error);
93
+ return { success: false, error };
94
+ }
95
+ }
96
+ //# sourceMappingURL=plan.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.service.js","sourceRoot":"","sources":["../../src/services/plan.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface Resource {
2
+ id: string;
3
+ uploader_id: string;
4
+ uploader_name?: string;
5
+ file_name: string;
6
+ file_path: string;
7
+ file_type: string;
8
+ file_size: number;
9
+ subject?: string;
10
+ source_email?: string;
11
+ parsed_text?: string;
12
+ create_time: number;
13
+ }
14
+ export interface ResourceResult {
15
+ success: boolean;
16
+ data?: Resource | Resource[] | {
17
+ total: number;
18
+ items: Resource[];
19
+ } | {
20
+ message: string;
21
+ };
22
+ error?: string;
23
+ }
24
+ export declare function upload(filePath: string, fileName: string, fileType: string, subject?: string, sourceEmail?: string): Promise<ResourceResult>;
25
+ export declare function list(subject?: string, fileType?: string, page?: number, pageSize?: number): ResourceResult;
26
+ export declare function deleteResource(resourceId: string): ResourceResult;
27
+ //# sourceMappingURL=resource.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.service.d.ts","sourceRoot":"","sources":["../../src/services/resource.service.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AA0BD,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAmFzB;AAED,wBAAgB,IAAI,CAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,IAAI,GAAE,MAAU,EAChB,QAAQ,GAAE,MAAW,GACpB,cAAc,CA0ChB;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAuBjE"}
@@ -0,0 +1,150 @@
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
+ exports.upload = upload;
7
+ exports.list = list;
8
+ exports.deleteResource = deleteResource;
9
+ const uuid_1 = require("uuid");
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const database_1 = require("../database");
12
+ const workspace_service_1 = require("./workspace.service");
13
+ const SUPERADMIN_ID = 'superadmin';
14
+ async function parseFileContent(filePath, fileType) {
15
+ try {
16
+ const lowerType = fileType.toLowerCase();
17
+ if (lowerType === 'txt' || lowerType === 'md') {
18
+ return fs_1.default.readFileSync(filePath, 'utf-8').slice(0, 10000);
19
+ }
20
+ if (lowerType === 'pdf') {
21
+ const pdfParse = require('pdf-parse');
22
+ const dataBuffer = fs_1.default.readFileSync(filePath);
23
+ const data = await pdfParse(dataBuffer);
24
+ return data.text.slice(0, 10000);
25
+ }
26
+ if (lowerType === 'docx' || lowerType === 'doc') {
27
+ const mammoth = require('mammoth');
28
+ const result = await mammoth.extractRawText({ path: filePath });
29
+ return result.value.slice(0, 10000);
30
+ }
31
+ return '';
32
+ }
33
+ catch (err) {
34
+ console.warn('Failed to parse file content:', err);
35
+ return '';
36
+ }
37
+ }
38
+ async function upload(filePath, fileName, fileType, subject, sourceEmail) {
39
+ try {
40
+ const db = (0, database_1.getDB)();
41
+ const now = Date.now();
42
+ if (!fs_1.default.existsSync(filePath)) {
43
+ return { success: false, error: '文件不存在' };
44
+ }
45
+ const fileStats = fs_1.default.statSync(filePath);
46
+ const fileSize = fileStats.size;
47
+ // Copy file to workspace
48
+ const fileContent = fs_1.default.readFileSync(filePath);
49
+ const storedSubDir = `resources/${subject || 'general'}`;
50
+ const storedFileName = `${(0, uuid_1.v4)()}_${fileName}`;
51
+ const storedPath = await (0, workspace_service_1.write)(storedSubDir, storedFileName, fileContent);
52
+ // Parse content
53
+ const parsedText = await parseFileContent(filePath, fileType);
54
+ const resourceId = (0, uuid_1.v4)();
55
+ db.prepare(`
56
+ INSERT INTO Resource (id, uploader_id, file_name, file_path, file_type, file_size, subject, source_email, parsed_text, create_user, update_user, create_time, update_time, delete_flag)
57
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)
58
+ `).run(resourceId, SUPERADMIN_ID, fileName, storedPath, fileType, fileSize, subject || null, sourceEmail || null, parsedText || null, SUPERADMIN_ID, SUPERADMIN_ID, now, now);
59
+ console.log(`Resource uploaded: ${fileName} by superadmin`);
60
+ // Notify agent
61
+ try {
62
+ const { getAgentEngine } = require('../agent');
63
+ const engine = getAgentEngine();
64
+ if (engine) {
65
+ engine.handleEvent({
66
+ type: 'new_resource',
67
+ resourceId,
68
+ fileName,
69
+ fileType,
70
+ subject,
71
+ uploaderId: SUPERADMIN_ID,
72
+ sourceEmail: sourceEmail || null,
73
+ studentId: SUPERADMIN_ID
74
+ });
75
+ }
76
+ }
77
+ catch {
78
+ // Agent not ready
79
+ }
80
+ const resource = {
81
+ id: resourceId,
82
+ uploader_id: SUPERADMIN_ID,
83
+ file_name: fileName,
84
+ file_path: storedPath,
85
+ file_type: fileType,
86
+ file_size: fileSize,
87
+ subject,
88
+ source_email: sourceEmail,
89
+ parsed_text: parsedText,
90
+ create_time: now
91
+ };
92
+ return { success: true, data: resource };
93
+ }
94
+ catch (err) {
95
+ const error = err instanceof Error ? err.message : String(err);
96
+ console.error('Resource upload error:', error);
97
+ return { success: false, error };
98
+ }
99
+ }
100
+ function list(subject, fileType, page = 1, pageSize = 20) {
101
+ try {
102
+ const db = (0, database_1.getDB)();
103
+ const conditions = ['r.delete_flag = 0'];
104
+ const params = [];
105
+ if (subject) {
106
+ conditions.push('r.subject = ?');
107
+ params.push(subject);
108
+ }
109
+ if (fileType) {
110
+ conditions.push('r.file_type = ?');
111
+ params.push(fileType);
112
+ }
113
+ const whereClause = conditions.join(' AND ');
114
+ const offset = (page - 1) * pageSize;
115
+ const total = db.prepare(`SELECT COUNT(*) as cnt FROM Resource r WHERE ${whereClause}`).get(...params).cnt;
116
+ const rows = db
117
+ .prepare(`SELECT r.*
118
+ FROM Resource r
119
+ WHERE ${whereClause}
120
+ ORDER BY r.create_time DESC
121
+ LIMIT ? OFFSET ?`)
122
+ .all(...params, pageSize, offset);
123
+ return { success: true, data: { total, items: rows } };
124
+ }
125
+ catch (err) {
126
+ const error = err instanceof Error ? err.message : String(err);
127
+ console.error('Resource list error:', error);
128
+ return { success: false, error };
129
+ }
130
+ }
131
+ function deleteResource(resourceId) {
132
+ try {
133
+ const db = (0, database_1.getDB)();
134
+ const now = Date.now();
135
+ const resource = db
136
+ .prepare('SELECT * FROM Resource WHERE id = ? AND delete_flag = 0')
137
+ .get(resourceId);
138
+ if (!resource) {
139
+ return { success: false, error: '资源不存在' };
140
+ }
141
+ db.prepare('UPDATE Resource SET delete_flag = 1, update_user = ?, update_time = ? WHERE id = ?').run(SUPERADMIN_ID, now, resourceId);
142
+ return { success: true, data: { message: '删除成功' } };
143
+ }
144
+ catch (err) {
145
+ const error = err instanceof Error ? err.message : String(err);
146
+ console.error('Resource delete error:', error);
147
+ return { success: false, error };
148
+ }
149
+ }
150
+ //# sourceMappingURL=resource.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.service.js","sourceRoot":"","sources":["../../src/services/resource.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export interface AIModel {
2
+ id: string;
3
+ name: string;
4
+ provider: string;
5
+ baseUrl?: string;
6
+ contextLength?: number;
7
+ supportsImages: boolean;
8
+ supportsTools: boolean;
9
+ }
10
+ export interface AIConfig {
11
+ provider: string;
12
+ modelId: string;
13
+ modelName?: string;
14
+ apiKey: string;
15
+ apiKeyMasked?: string;
16
+ baseUrl?: string;
17
+ }
18
+ export interface EmailConfig {
19
+ email: string;
20
+ imapHost: string;
21
+ imapPort: number;
22
+ configured: boolean;
23
+ }
24
+ export interface SettingsResult {
25
+ success: boolean;
26
+ data?: unknown;
27
+ error?: string;
28
+ }
29
+ export declare function getModels(): Promise<SettingsResult>;
30
+ export declare function saveAIConfig(provider: string, modelId: string, modelName: string, apiKey: string, baseUrl?: string): SettingsResult;
31
+ export declare function getAIConfig(): SettingsResult;
32
+ export declare function saveEmailConfig(email: string, authCode: string, imapHost: string, imapPort: number): Promise<SettingsResult>;
33
+ export declare function getEmailConfig(): SettingsResult;
34
+ export declare function getRawEmailConfig(): {
35
+ email: string;
36
+ authCode: string;
37
+ imapHost: string;
38
+ imapPort: number;
39
+ } | null;
40
+ export declare function testEmailConnection(): Promise<SettingsResult>;
41
+ //# sourceMappingURL=settings.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.service.d.ts","sourceRoot":"","sources":["../../src/services/settings.service.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAWD,wBAAsB,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC,CAwCzD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,CAYnI;AAED,wBAAgB,WAAW,IAAI,cAAc,CAmC5C;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAWlI;AAED,wBAAgB,cAAc,IAAI,cAAc,CAa/C;AAED,wBAAgB,iBAAiB,IAAI;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgBlH;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CAkBnE"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.getModels = getModels;
40
+ exports.saveAIConfig = saveAIConfig;
41
+ exports.getAIConfig = getAIConfig;
42
+ exports.saveEmailConfig = saveEmailConfig;
43
+ exports.getEmailConfig = getEmailConfig;
44
+ exports.getRawEmailConfig = getRawEmailConfig;
45
+ exports.testEmailConnection = testEmailConnection;
46
+ const crypto_1 = __importDefault(require("crypto"));
47
+ const axios_1 = __importDefault(require("axios"));
48
+ const uuid_1 = require("uuid");
49
+ const database_1 = require("../database");
50
+ // 用环境变量做 AES 密钥,默认 fallback(本地部署够用)
51
+ const ENC_KEY = crypto_1.default.createHash('sha256')
52
+ .update(process.env.ENCRYPT_SECRET || 'personalac-default-secret-key')
53
+ .digest();
54
+ function encryptValue(value) {
55
+ try {
56
+ const iv = crypto_1.default.randomBytes(16);
57
+ const cipher = crypto_1.default.createCipheriv('aes-256-cbc', ENC_KEY, iv);
58
+ const encrypted = Buffer.concat([cipher.update(value, 'utf8'), cipher.final()]);
59
+ return { encrypted: iv.toString('hex') + ':' + encrypted.toString('hex'), isEncrypted: true };
60
+ }
61
+ catch {
62
+ return { encrypted: value, isEncrypted: false };
63
+ }
64
+ }
65
+ function decryptValue(value, isEncrypted) {
66
+ if (!isEncrypted)
67
+ return value;
68
+ try {
69
+ const [ivHex, encHex] = value.split(':');
70
+ const iv = Buffer.from(ivHex, 'hex');
71
+ const decipher = crypto_1.default.createDecipheriv('aes-256-cbc', ENC_KEY, iv);
72
+ return Buffer.concat([decipher.update(Buffer.from(encHex, 'hex')), decipher.final()]).toString('utf8');
73
+ }
74
+ catch {
75
+ return value;
76
+ }
77
+ }
78
+ function upsertSetting(key, value, encrypted) {
79
+ const db = (0, database_1.getDB)();
80
+ const now = Date.now();
81
+ const existing = db.prepare('SELECT id FROM Settings WHERE key = ? AND delete_flag = 0').get(key);
82
+ if (existing) {
83
+ db.prepare('UPDATE Settings SET value = ?, encrypted = ?, update_time = ? WHERE key = ? AND delete_flag = 0')
84
+ .run(value, encrypted, now, key);
85
+ }
86
+ else {
87
+ db.prepare('INSERT INTO Settings (id, key, value, encrypted, create_time, update_time, delete_flag) VALUES (?, ?, ?, ?, ?, ?, 0)')
88
+ .run((0, uuid_1.v4)(), key, value, encrypted, now, now);
89
+ }
90
+ }
91
+ function getSetting(key) {
92
+ return (0, database_1.getDB)()
93
+ .prepare('SELECT value, encrypted FROM Settings WHERE key = ? AND delete_flag = 0')
94
+ .get(key);
95
+ }
96
+ async function getModels() {
97
+ try {
98
+ const response = await axios_1.default.get('https://models.dev/api.json', { timeout: 12000 });
99
+ const raw = response.data;
100
+ const formatted = [];
101
+ for (const [providerId, provider] of Object.entries(raw)) {
102
+ if (!provider.models)
103
+ continue;
104
+ for (const [modelId, model] of Object.entries(provider.models)) {
105
+ const inputMods = model.modalities?.input || [];
106
+ if (!inputMods.includes('text'))
107
+ continue;
108
+ formatted.push({
109
+ id: `${providerId}/${modelId}`,
110
+ name: model.name || modelId,
111
+ provider: provider.name || providerId,
112
+ baseUrl: provider.api,
113
+ contextLength: model.limit?.context,
114
+ supportsImages: inputMods.includes('image'),
115
+ supportsTools: model.tool_call === true
116
+ });
117
+ }
118
+ }
119
+ try {
120
+ upsertSetting('last_model_json', JSON.stringify(response.data), 0);
121
+ }
122
+ catch { /* cache fail is ok */ }
123
+ return { success: true, data: formatted };
124
+ }
125
+ catch (err) {
126
+ const error = err instanceof Error ? err.message : String(err);
127
+ console.warn('[Settings] getModels fetch failed, using fallback:', error);
128
+ return {
129
+ success: true,
130
+ data: [
131
+ { id: 'gpt-4o', name: 'GPT-4o', provider: 'openai', supportsImages: true, supportsTools: true },
132
+ { id: 'claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet', provider: 'anthropic', supportsImages: true, supportsTools: true },
133
+ { id: 'gemini-1.5-pro', name: 'Gemini 1.5 Pro', provider: 'google', supportsImages: true, supportsTools: true }
134
+ ]
135
+ };
136
+ }
137
+ }
138
+ function saveAIConfig(provider, modelId, modelName, apiKey, baseUrl) {
139
+ try {
140
+ const { encrypted: encKey, isEncrypted } = encryptValue(apiKey);
141
+ upsertSetting('ai_provider', provider, 0);
142
+ upsertSetting('ai_model_id', modelId, 0);
143
+ upsertSetting('ai_model_name', modelName || modelId, 0);
144
+ upsertSetting('ai_api_key', encKey, isEncrypted ? 1 : 0);
145
+ upsertSetting('ai_base_url', baseUrl || '', 0);
146
+ return { success: true, data: { message: 'AI 配置已保存' } };
147
+ }
148
+ catch (err) {
149
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
150
+ }
151
+ }
152
+ function getAIConfig() {
153
+ try {
154
+ const keys = ['ai_provider', 'ai_model_id', 'ai_model_name', 'ai_api_key', 'ai_base_url'];
155
+ const result = {};
156
+ for (const key of keys) {
157
+ const row = getSetting(key);
158
+ if (row) {
159
+ if (key === 'ai_api_key') {
160
+ const decrypted = decryptValue(row.value, row.encrypted === 1);
161
+ result[key] = decrypted;
162
+ result['ai_api_key_masked'] = decrypted.length > 8
163
+ ? decrypted.slice(0, 4) + '****' + decrypted.slice(-4) : '****';
164
+ }
165
+ else {
166
+ result[key] = row.value;
167
+ }
168
+ }
169
+ else {
170
+ result[key] = '';
171
+ }
172
+ }
173
+ return {
174
+ success: true,
175
+ data: {
176
+ provider: result['ai_provider'],
177
+ modelId: result['ai_model_id'],
178
+ modelName: result['ai_model_name'],
179
+ apiKey: result['ai_api_key'],
180
+ apiKeyMasked: result['ai_api_key_masked'],
181
+ baseUrl: result['ai_base_url']
182
+ }
183
+ };
184
+ }
185
+ catch (err) {
186
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
187
+ }
188
+ }
189
+ async function saveEmailConfig(email, authCode, imapHost, imapPort) {
190
+ try {
191
+ const { encrypted: encCode, isEncrypted } = encryptValue(authCode);
192
+ upsertSetting('email_api_config', JSON.stringify({
193
+ email, auth_code: encCode, auth_code_encrypted: isEncrypted,
194
+ imap_host: imapHost, imap_port: imapPort
195
+ }), 0);
196
+ return { success: true, data: { message: '邮件配置已保存' } };
197
+ }
198
+ catch (err) {
199
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
200
+ }
201
+ }
202
+ function getEmailConfig() {
203
+ try {
204
+ const row = getSetting('email_api_config');
205
+ if (!row)
206
+ return { success: true, data: { configured: false } };
207
+ const parsed = JSON.parse(row.value);
208
+ return {
209
+ success: true,
210
+ data: { email: parsed.email, imapHost: parsed.imap_host, imapPort: parsed.imap_port, configured: true }
211
+ };
212
+ }
213
+ catch (err) {
214
+ return { success: false, error: err instanceof Error ? err.message : String(err) };
215
+ }
216
+ }
217
+ function getRawEmailConfig() {
218
+ try {
219
+ const row = getSetting('email_api_config');
220
+ if (!row)
221
+ return null;
222
+ const parsed = JSON.parse(row.value);
223
+ return {
224
+ email: parsed.email,
225
+ authCode: decryptValue(parsed.auth_code, parsed.auth_code_encrypted === true),
226
+ imapHost: parsed.imap_host,
227
+ imapPort: parsed.imap_port
228
+ };
229
+ }
230
+ catch {
231
+ return null;
232
+ }
233
+ }
234
+ async function testEmailConnection() {
235
+ try {
236
+ const config = getRawEmailConfig();
237
+ if (!config)
238
+ return { success: false, error: '未配置邮件信息' };
239
+ const { ImapFlow } = await Promise.resolve().then(() => __importStar(require('imapflow')));
240
+ const client = new ImapFlow({
241
+ host: config.imapHost, port: config.imapPort,
242
+ secure: config.imapPort === 993,
243
+ auth: { user: config.email, pass: config.authCode },
244
+ logger: false
245
+ });
246
+ await client.connect();
247
+ await client.logout();
248
+ return { success: true, data: { message: '邮件连接测试成功' } };
249
+ }
250
+ catch (err) {
251
+ return { success: false, error: `连接失败: ${err instanceof Error ? err.message : String(err)}` };
252
+ }
253
+ }
254
+ //# sourceMappingURL=settings.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.service.js","sourceRoot":"","sources":["../../src/services/settings.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ export type UrgencyLevel = 'idle' | 'normal' | 'attention' | 'urgent';
2
+ export interface SobrietySnapshot {
3
+ generated_at: number;
4
+ days_since_active: number | null;
5
+ exam: {
6
+ type: string;
7
+ date: number;
8
+ days_left: number;
9
+ } | null;
10
+ due_reviews: Array<{
11
+ topic: string;
12
+ subject: string;
13
+ retention: number;
14
+ days_overdue: number;
15
+ }>;
16
+ persistent_blocks: Array<{
17
+ topic: string;
18
+ subject: string;
19
+ root_cause: string | null;
20
+ attempts: number;
21
+ }>;
22
+ subject_drift: {
23
+ recent_distribution: Record<string, number>;
24
+ primary_subject: string | null;
25
+ drift_warning: string | null;
26
+ };
27
+ unresolved_from_last: string | null;
28
+ urgency: {
29
+ level: UrgencyLevel;
30
+ reasons: string[];
31
+ };
32
+ today_priority: string;
33
+ }
34
+ export declare function generateSobrietySnapshot(studentId: string): SobrietySnapshot;
35
+ export declare function saveSobrietySnapshot(studentId: string, snap: SobrietySnapshot): void;
36
+ export declare function getSobrietySnapshot(studentId: string): SobrietySnapshot | null;
37
+ export declare function refreshSobrietySnapshot(studentId: string): SobrietySnapshot;
38
+ export declare function getLastUrgency(studentId: string): UrgencyLevel | null;
39
+ export declare function markNotified(studentId: string): void;
40
+ export declare function getOrRefreshSnapshot(studentId: string, maxAgeMs?: number): SobrietySnapshot;
41
+ //# sourceMappingURL=sobriety.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sobriety.service.d.ts","sourceRoot":"","sources":["../../src/services/sobriety.service.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAA;AAErE,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAE9D,WAAW,EAAE,KAAK,CAAC;QACjB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,CAAA;KACrB,CAAC,CAAA;IAEF,iBAAiB,EAAE,KAAK,CAAC;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,OAAO,EAAE,MAAM,CAAA;QACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;QACzB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;IAEF,aAAa,EAAE;QACb,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3C,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;QAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAC7B,CAAA;IAED,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IAEnC,OAAO,EAAE;QAAE,KAAK,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;IAGnD,cAAc,EAAE,MAAM,CAAA;CACvB;AAMD,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAmM5E;AAMD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAgBpF;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAO9E;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAI3E;AAMD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMrE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKpD;AAGD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAiB,GAAG,gBAAgB,CAInG"}