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.
- package/README.md +249 -0
- package/bin/personalac.js +215 -0
- package/dist/agent/context.d.ts +39 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +163 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/executors.d.ts +40 -0
- package/dist/agent/executors.d.ts.map +1 -0
- package/dist/agent/executors.js +177 -0
- package/dist/agent/executors.js.map +1 -0
- package/dist/agent/index.d.ts +61 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +907 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/planner.d.ts +15 -0
- package/dist/agent/planner.d.ts.map +1 -0
- package/dist/agent/planner.js +81 -0
- package/dist/agent/planner.js.map +1 -0
- package/dist/agent/scheduler.d.ts +22 -0
- package/dist/agent/scheduler.d.ts.map +1 -0
- package/dist/agent/scheduler.js +178 -0
- package/dist/agent/scheduler.js.map +1 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +283 -0
- package/dist/database/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +141 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.middleware.d.ts +6 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +19 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/routes/agent.routes.d.ts +3 -0
- package/dist/routes/agent.routes.d.ts.map +1 -0
- package/dist/routes/agent.routes.js +101 -0
- package/dist/routes/agent.routes.js.map +1 -0
- package/dist/routes/auth.routes.d.ts +3 -0
- package/dist/routes/auth.routes.d.ts.map +1 -0
- package/dist/routes/auth.routes.js +66 -0
- package/dist/routes/auth.routes.js.map +1 -0
- package/dist/routes/chat.routes.d.ts +3 -0
- package/dist/routes/chat.routes.d.ts.map +1 -0
- package/dist/routes/chat.routes.js +80 -0
- package/dist/routes/chat.routes.js.map +1 -0
- package/dist/routes/data.routes.d.ts +3 -0
- package/dist/routes/data.routes.d.ts.map +1 -0
- package/dist/routes/data.routes.js +16 -0
- package/dist/routes/data.routes.js.map +1 -0
- package/dist/routes/email.routes.d.ts +3 -0
- package/dist/routes/email.routes.d.ts.map +1 -0
- package/dist/routes/email.routes.js +18 -0
- package/dist/routes/email.routes.js.map +1 -0
- package/dist/routes/goals.routes.d.ts +3 -0
- package/dist/routes/goals.routes.d.ts.map +1 -0
- package/dist/routes/goals.routes.js +45 -0
- package/dist/routes/goals.routes.js.map +1 -0
- package/dist/routes/plans.routes.d.ts +3 -0
- package/dist/routes/plans.routes.d.ts.map +1 -0
- package/dist/routes/plans.routes.js +19 -0
- package/dist/routes/plans.routes.js.map +1 -0
- package/dist/routes/settings.routes.d.ts +3 -0
- package/dist/routes/settings.routes.d.ts.map +1 -0
- package/dist/routes/settings.routes.js +29 -0
- package/dist/routes/settings.routes.js.map +1 -0
- package/dist/routes/workspace.routes.d.ts +3 -0
- package/dist/routes/workspace.routes.d.ts.map +1 -0
- package/dist/routes/workspace.routes.js +28 -0
- package/dist/routes/workspace.routes.js.map +1 -0
- package/dist/services/auth.service.d.ts +32 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +110 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/data.service.d.ts +47 -0
- package/dist/services/data.service.d.ts.map +1 -0
- package/dist/services/data.service.js +139 -0
- package/dist/services/data.service.js.map +1 -0
- package/dist/services/email.service.d.ts +23 -0
- package/dist/services/email.service.d.ts.map +1 -0
- package/dist/services/email.service.js +316 -0
- package/dist/services/email.service.js.map +1 -0
- package/dist/services/notify.service.d.ts +2 -0
- package/dist/services/notify.service.d.ts.map +1 -0
- package/dist/services/notify.service.js +21 -0
- package/dist/services/notify.service.js.map +1 -0
- package/dist/services/plan.service.d.ts +21 -0
- package/dist/services/plan.service.d.ts.map +1 -0
- package/dist/services/plan.service.js +96 -0
- package/dist/services/plan.service.js.map +1 -0
- package/dist/services/resource.service.d.ts +27 -0
- package/dist/services/resource.service.d.ts.map +1 -0
- package/dist/services/resource.service.js +150 -0
- package/dist/services/resource.service.js.map +1 -0
- package/dist/services/settings.service.d.ts +41 -0
- package/dist/services/settings.service.d.ts.map +1 -0
- package/dist/services/settings.service.js +254 -0
- package/dist/services/settings.service.js.map +1 -0
- package/dist/services/sobriety.service.d.ts +41 -0
- package/dist/services/sobriety.service.d.ts.map +1 -0
- package/dist/services/sobriety.service.js +243 -0
- package/dist/services/sobriety.service.js.map +1 -0
- package/dist/services/workspace.service.d.ts +71 -0
- package/dist/services/workspace.service.d.ts.map +1 -0
- package/dist/services/workspace.service.js +265 -0
- package/dist/services/workspace.service.js.map +1 -0
- package/dist/tools/chat-tools.d.ts +2 -0
- package/dist/tools/chat-tools.d.ts.map +1 -0
- package/dist/tools/chat-tools.js +419 -0
- package/dist/tools/chat-tools.js.map +1 -0
- package/dist/tools/index.d.ts +19 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/package.json +38 -0
- package/public/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/public/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/public/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/public/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/public/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/public/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/public/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/public/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/public/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/public/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/public/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/public/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/public/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/public/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/public/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/public/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/public/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/public/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/public/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/public/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/public/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/public/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/public/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/public/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/public/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/public/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/public/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/public/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/public/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/public/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/public/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/public/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/public/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/public/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/public/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/public/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/public/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/public/assets/_baseUniq-DiHtXYsr.js +1 -0
- package/public/assets/arc-Bv1zbXf7.js +1 -0
- package/public/assets/architectureDiagram-Q4EWVU46-EbiUvXBr.js +36 -0
- package/public/assets/blockDiagram-DXYQGD6D-B-4wwQNT.js +132 -0
- package/public/assets/c4Diagram-AHTNJAMY-brLyKMPJ.js +10 -0
- package/public/assets/channel-Me4d6Y1x.js +1 -0
- package/public/assets/chunk-4BX2VUAB-DMh-4Nye.js +1 -0
- package/public/assets/chunk-4TB4RGXK-CSr1z2CQ.js +206 -0
- package/public/assets/chunk-55IACEB6-xN0xmcvD.js +1 -0
- package/public/assets/chunk-EDXVE4YY-CkCM3j5E.js +1 -0
- package/public/assets/chunk-FMBD7UC4-B-mDgsjM.js +15 -0
- package/public/assets/chunk-OYMX7WX6-DK8dg9K4.js +231 -0
- package/public/assets/chunk-QZHKN3VN-BZGbFOdK.js +1 -0
- package/public/assets/chunk-YZCP3GAM-BTmFmMer.js +1 -0
- package/public/assets/classDiagram-6PBFFD2Q-BXgAb5m4.js +1 -0
- package/public/assets/classDiagram-v2-HSJHXN6E-BXgAb5m4.js +1 -0
- package/public/assets/clone-rnECnpTI.js +1 -0
- package/public/assets/cose-bilkent-S5V4N54A-BBqCwo63.js +1 -0
- package/public/assets/cytoscape.esm-BQk4lpUV.js +331 -0
- package/public/assets/dagre-KV5264BT-DLeQYvAA.js +4 -0
- package/public/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/public/assets/diagram-5BDNPKRD-D85z2LaM.js +10 -0
- package/public/assets/diagram-G4DWMVQ6-4AvBmvcP.js +24 -0
- package/public/assets/diagram-MMDJMWI5-DRNEGNZA.js +43 -0
- package/public/assets/diagram-TYMM5635-C_oGwrmX.js +24 -0
- package/public/assets/erDiagram-SMLLAGMA-DDSp8ANa.js +85 -0
- package/public/assets/flowDiagram-DWJPFMVM-B1Wy36da.js +162 -0
- package/public/assets/ganttDiagram-T4ZO3ILL-CQ7VWheo.js +292 -0
- package/public/assets/gitGraphDiagram-UUTBAWPF-BhvM7s41.js +106 -0
- package/public/assets/graph-fatjTp1h.js +1 -0
- package/public/assets/index-1PrEnCZL.js +677 -0
- package/public/assets/index-DcsnItNp.css +1 -0
- package/public/assets/infoDiagram-42DDH7IO-4eawOC2G.js +2 -0
- package/public/assets/init-Gi6I4Gst.js +1 -0
- package/public/assets/ishikawaDiagram-UXIWVN3A-CJWfG1fv.js +70 -0
- package/public/assets/journeyDiagram-VCZTEJTY-C4Zx3dpF.js +139 -0
- package/public/assets/kanban-definition-6JOO6SKY-CV1vDcC8.js +89 -0
- package/public/assets/layout-CX0IDv3q.js +1 -0
- package/public/assets/linear-C8hMcu9f.js +1 -0
- package/public/assets/min-BaxMGW9J.js +1 -0
- package/public/assets/mindmap-definition-QFDTVHPH-KzGyX4Em.js +96 -0
- package/public/assets/ordinal-Cboi1Yqb.js +1 -0
- package/public/assets/pieDiagram-DEJITSTG-Dp2x5kvP.js +30 -0
- package/public/assets/quadrantDiagram-34T5L4WZ-B4yqA6XF.js +7 -0
- package/public/assets/requirementDiagram-MS252O5E-DEjN_2tG.js +84 -0
- package/public/assets/sankeyDiagram-XADWPNL6-BKm_F5FA.js +10 -0
- package/public/assets/sequenceDiagram-FGHM5R23-07BCMKjW.js +157 -0
- package/public/assets/stateDiagram-FHFEXIEX-DVz6GtR8.js +1 -0
- package/public/assets/stateDiagram-v2-QKLJ7IA2-DYiYr0PB.js +1 -0
- package/public/assets/timeline-definition-GMOUNBTQ-C0u67FqY.js +120 -0
- package/public/assets/vennDiagram-DHZGUBPP-BiAlMVLe.js +34 -0
- package/public/assets/wardley-RL74JXVD-BnWyuHzf.js +162 -0
- package/public/assets/wardleyDiagram-NUSXRM2D-DEL2Lx6S.js +20 -0
- package/public/assets/xychartDiagram-5P7HB3ND-ILdmj7ok.js +7 -0
- 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":";;;;;AAmDA,wBAyFC;AAED,oBA+CC;AAED,wCAuBC;AAtND,+BAAmC;AACnC,4CAAmB;AACnB,0CAAmC;AACnC,2DAA6D;AAE7D,MAAM,aAAa,GAAG,YAAY,CAAA;AAsBlC,KAAK,UAAU,gBAAgB,CAAC,QAAgB,EAAE,QAAgB;IAChE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;QACxC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;YACrC,MAAM,UAAU,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAC5C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAA;YACvC,OAAQ,IAAI,CAAC,IAAe,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9C,CAAC;QACD,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;YAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC/D,OAAQ,MAAM,CAAC,KAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QACjD,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;QAClD,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,MAAM,CAC1B,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,OAAgB,EAChB,WAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;QAC3C,CAAC;QAED,MAAM,SAAS,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAA;QAE/B,yBAAyB;QACzB,MAAM,WAAW,GAAG,YAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;QAC7C,MAAM,YAAY,GAAG,aAAa,OAAO,IAAI,SAAS,EAAE,CAAA;QACxD,MAAM,cAAc,GAAG,GAAG,IAAA,SAAM,GAAE,IAAI,QAAQ,EAAE,CAAA;QAChD,MAAM,UAAU,GAAG,MAAM,IAAA,yBAAc,EAAC,YAAY,EAAE,cAAc,EAAE,WAAW,CAAC,CAAA;QAElF,gBAAgB;QAChB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAE7D,MAAM,UAAU,GAAG,IAAA,SAAM,GAAE,CAAA;QAE3B,EAAE,CAAC,OAAO,CAAC;;;KAGV,CAAC,CAAC,GAAG,CACJ,UAAU,EACV,aAAa,EACb,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,OAAO,IAAI,IAAI,EACf,WAAW,IAAI,IAAI,EACnB,UAAU,IAAI,IAAI,EAClB,aAAa,EACb,aAAa,EACb,GAAG,EACH,GAAG,CACJ,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,gBAAgB,CAAC,CAAA;QAE3D,eAAe;QACf,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,WAAW,CAAC;oBACjB,IAAI,EAAE,cAAc;oBACpB,UAAU;oBACV,QAAQ;oBACR,QAAQ;oBACR,OAAO;oBACP,UAAU,EAAE,aAAa;oBACzB,WAAW,EAAE,WAAW,IAAI,IAAI;oBAChC,SAAS,EAAE,aAAa;iBACzB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QAED,MAAM,QAAQ,GAAa;YACzB,EAAE,EAAE,UAAU;YACd,WAAW,EAAE,aAAa;YAC1B,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;YACnB,OAAO;YACP,YAAY,EAAE,WAAW;YACzB,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,GAAG;SACjB,CAAA;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9D,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IAClC,CAAC;AACH,CAAC;AAED,SAAgB,IAAI,CAClB,OAAgB,EAChB,QAAiB,EACjB,OAAe,CAAC,EAChB,WAAmB,EAAE;IAErB,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;QAElB,MAAM,UAAU,GAAa,CAAC,mBAAmB,CAAC,CAAA;QAClD,MAAM,MAAM,GAAwB,EAAE,CAAA;QAEtC,IAAI,OAAO,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvB,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAA;QAEpC,MAAM,KAAK,GACT,EAAE,CAAC,OAAO,CAAC,gDAAgD,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAGxF,CAAC,GAAG,CAAA;QAEL,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN;;iBAES,WAAW;;0BAEF,CACnB;aACA,GAAG,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAe,CAAA;QAEjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAA;IACxD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9D,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAA;QAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IAClC,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,UAAkB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAA;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAEtB,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,yDAAyD,CAAC;aAClE,GAAG,CAAC,UAAU,CAAyB,CAAA;QAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;QAC3C,CAAC;QAED,EAAE,CAAC,OAAO,CACR,oFAAoF,CACrF,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QAErC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAA;IACrD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC9D,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|