@studious-lms/server 1.12.0 → 1.14.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 (338) hide show
  1. package/.dockerignore +28 -0
  2. package/.env.example +5 -0
  3. package/.github/workflows/deploy.yml +123 -0
  4. package/Dockerfile +54 -0
  5. package/dist/index.js +5 -2
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/config/cors.d.ts.map +1 -1
  8. package/dist/lib/config/cors.js +31 -11
  9. package/dist/lib/config/cors.js.map +1 -1
  10. package/dist/lib/config/env.d.ts +17 -0
  11. package/dist/lib/config/env.d.ts.map +1 -1
  12. package/dist/lib/config/env.js +8 -2
  13. package/dist/lib/config/env.js.map +1 -1
  14. package/dist/lib/googleCloudStorage.d.ts +10 -0
  15. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  16. package/dist/lib/googleCloudStorage.js +22 -2
  17. package/dist/lib/googleCloudStorage.js.map +1 -1
  18. package/dist/lib/prisma.d.ts +104 -5
  19. package/dist/lib/prisma.d.ts.map +1 -1
  20. package/dist/lib/prisma.js +33 -2
  21. package/dist/lib/prisma.js.map +1 -1
  22. package/dist/models/agenda.d.ts +20 -20
  23. package/dist/models/announcement.d.ts +177 -69
  24. package/dist/models/announcement.d.ts.map +1 -1
  25. package/dist/models/assignment.d.ts +551 -353
  26. package/dist/models/assignment.d.ts.map +1 -1
  27. package/dist/models/attendance.d.ts +197 -71
  28. package/dist/models/attendance.d.ts.map +1 -1
  29. package/dist/models/auth.d.ts +348 -114
  30. package/dist/models/auth.d.ts.map +1 -1
  31. package/dist/models/class.d.ts +324 -188
  32. package/dist/models/class.d.ts.map +1 -1
  33. package/dist/models/class.js +9 -3
  34. package/dist/models/class.js.map +1 -1
  35. package/dist/models/cloudStorage.d.ts +146 -56
  36. package/dist/models/cloudStorage.d.ts.map +1 -1
  37. package/dist/models/comment.d.ts +269 -110
  38. package/dist/models/comment.d.ts.map +1 -1
  39. package/dist/models/comment.js +3 -2
  40. package/dist/models/comment.js.map +1 -1
  41. package/dist/models/conversation.d.ts +206 -63
  42. package/dist/models/conversation.d.ts.map +1 -1
  43. package/dist/models/conversation.js +13 -2
  44. package/dist/models/conversation.js.map +1 -1
  45. package/dist/models/department.d.ts +196 -70
  46. package/dist/models/department.d.ts.map +1 -1
  47. package/dist/models/event.d.ts +287 -125
  48. package/dist/models/event.d.ts.map +1 -1
  49. package/dist/models/file.d.ts +389 -263
  50. package/dist/models/file.d.ts.map +1 -1
  51. package/dist/models/folder.d.ts +433 -181
  52. package/dist/models/folder.d.ts.map +1 -1
  53. package/dist/models/labChat.d.ts +209 -83
  54. package/dist/models/labChat.d.ts.map +1 -1
  55. package/dist/models/marketing.d.ts +80 -26
  56. package/dist/models/marketing.d.ts.map +1 -1
  57. package/dist/models/message.d.ts +95 -41
  58. package/dist/models/message.d.ts.map +1 -1
  59. package/dist/models/newtonChat.d.ts +83 -29
  60. package/dist/models/newtonChat.d.ts.map +1 -1
  61. package/dist/models/notification.d.ts +61 -25
  62. package/dist/models/notification.d.ts.map +1 -1
  63. package/dist/models/school.d.ts +349 -133
  64. package/dist/models/school.d.ts.map +1 -1
  65. package/dist/models/section.d.ts +216 -72
  66. package/dist/models/section.d.ts.map +1 -1
  67. package/dist/models/tag.d.ts +156 -48
  68. package/dist/models/tag.d.ts.map +1 -1
  69. package/dist/models/user.d.ts +82 -28
  70. package/dist/models/user.d.ts.map +1 -1
  71. package/dist/models/worksheet.d.ts +1023 -410
  72. package/dist/models/worksheet.d.ts.map +1 -1
  73. package/dist/models/worksheet.js +19 -7
  74. package/dist/models/worksheet.js.map +1 -1
  75. package/dist/pipelines/aiLabChat.d.ts +0 -8
  76. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  77. package/dist/pipelines/aiLabChat.js +50 -67
  78. package/dist/pipelines/aiLabChat.js.map +1 -1
  79. package/dist/pipelines/aiLabChatContract.d.ts +393 -388
  80. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  81. package/dist/pipelines/aiLabChatContract.js +63 -69
  82. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  83. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
  84. package/dist/pipelines/aiNewtonChat.js +41 -41
  85. package/dist/pipelines/aiNewtonChat.js.map +1 -1
  86. package/dist/pipelines/gradeWorksheet.d.ts +8 -8
  87. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
  88. package/dist/pipelines/gradeWorksheet.js +59 -14
  89. package/dist/pipelines/gradeWorksheet.js.map +1 -1
  90. package/dist/pipelines/labChatPrompt.d.ts +10 -8
  91. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  92. package/dist/pipelines/labChatPrompt.js +47 -67
  93. package/dist/pipelines/labChatPrompt.js.map +1 -1
  94. package/dist/pipelines/pdfToWorksheet.d.ts +2 -2
  95. package/dist/routers/_app.d.ts +2268 -1898
  96. package/dist/routers/_app.d.ts.map +1 -1
  97. package/dist/routers/_app.js +4 -2
  98. package/dist/routers/_app.js.map +1 -1
  99. package/dist/routers/admin.d.ts +13 -13
  100. package/dist/routers/agenda.d.ts +18 -18
  101. package/dist/routers/announcement.d.ts +32 -28
  102. package/dist/routers/announcement.d.ts.map +1 -1
  103. package/dist/routers/announcement.js +6 -5
  104. package/dist/routers/announcement.js.map +1 -1
  105. package/dist/routers/assignment.d.ts +335 -327
  106. package/dist/routers/assignment.d.ts.map +1 -1
  107. package/dist/routers/assignment.js +4 -4
  108. package/dist/routers/assignment.js.map +1 -1
  109. package/dist/routers/attendance.d.ts +10 -10
  110. package/dist/routers/auth.d.ts +2 -2
  111. package/dist/routers/class.d.ts +170 -147
  112. package/dist/routers/class.d.ts.map +1 -1
  113. package/dist/routers/comment.d.ts +40 -16
  114. package/dist/routers/comment.d.ts.map +1 -1
  115. package/dist/routers/comment.js +6 -3
  116. package/dist/routers/comment.js.map +1 -1
  117. package/dist/routers/conversation.d.ts +17 -17
  118. package/dist/routers/department.d.ts +34 -34
  119. package/dist/routers/discussion.d.ts +65 -53
  120. package/dist/routers/discussion.d.ts.map +1 -1
  121. package/dist/routers/discussion.js +6 -2
  122. package/dist/routers/discussion.js.map +1 -1
  123. package/dist/routers/embedding.d.ts +69 -0
  124. package/dist/routers/embedding.d.ts.map +1 -0
  125. package/dist/routers/embedding.js +143 -0
  126. package/dist/routers/embedding.js.map +1 -0
  127. package/dist/routers/event.d.ts +39 -39
  128. package/dist/routers/file.d.ts +12 -12
  129. package/dist/routers/folder.d.ts +38 -38
  130. package/dist/routers/labChat.d.ts +19 -19
  131. package/dist/routers/marketing.d.ts +2 -2
  132. package/dist/routers/message.d.ts +13 -13
  133. package/dist/routers/newtonChat.d.ts +4 -4
  134. package/dist/routers/notifications.d.ts +9 -9
  135. package/dist/routers/permissions.d.ts +14 -14
  136. package/dist/routers/school.d.ts +55 -55
  137. package/dist/routers/search.d.ts +22 -1
  138. package/dist/routers/search.d.ts.map +1 -1
  139. package/dist/routers/search.js +9 -3
  140. package/dist/routers/search.js.map +1 -1
  141. package/dist/routers/section.d.ts +4 -4
  142. package/dist/routers/studentProgress.d.ts +1 -1
  143. package/dist/routers/tag.d.ts +7 -7
  144. package/dist/routers/user.d.ts +10 -10
  145. package/dist/routers/worksheet.d.ts +97 -56
  146. package/dist/routers/worksheet.d.ts.map +1 -1
  147. package/dist/routers/worksheet.js +28 -2
  148. package/dist/routers/worksheet.js.map +1 -1
  149. package/dist/routes/aiStream.d.ts +2 -0
  150. package/dist/routes/aiStream.d.ts.map +1 -0
  151. package/dist/routes/aiStream.js +696 -0
  152. package/dist/routes/aiStream.js.map +1 -0
  153. package/dist/seedDatabase.d.ts +2 -2
  154. package/dist/seedDatabase.js +6 -6
  155. package/dist/seedDatabase.js.map +1 -1
  156. package/dist/services/adminInstitution.d.ts +8 -8
  157. package/dist/services/adminRunJob.d.ts +4 -4
  158. package/dist/services/agenda.d.ts +18 -18
  159. package/dist/services/aiChatStream.d.ts +68 -0
  160. package/dist/services/aiChatStream.d.ts.map +1 -0
  161. package/dist/services/aiChatStream.js +157 -0
  162. package/dist/services/aiChatStream.js.map +1 -0
  163. package/dist/services/aiModifierTools.d.ts +32 -0
  164. package/dist/services/aiModifierTools.d.ts.map +1 -0
  165. package/dist/services/aiModifierTools.js +165 -0
  166. package/dist/services/aiModifierTools.js.map +1 -0
  167. package/dist/services/aiProposalTools.d.ts +32 -0
  168. package/dist/services/aiProposalTools.d.ts.map +1 -0
  169. package/dist/services/aiProposalTools.js +207 -0
  170. package/dist/services/aiProposalTools.js.map +1 -0
  171. package/dist/services/aiStream.d.ts +22 -0
  172. package/dist/services/aiStream.d.ts.map +1 -0
  173. package/dist/services/aiStream.js +142 -0
  174. package/dist/services/aiStream.js.map +1 -0
  175. package/dist/services/aiTools.d.ts +16 -0
  176. package/dist/services/aiTools.d.ts.map +1 -0
  177. package/dist/services/aiTools.js +271 -0
  178. package/dist/services/aiTools.js.map +1 -0
  179. package/dist/services/announcement.d.ts +12 -12
  180. package/dist/services/announcement.d.ts.map +1 -1
  181. package/dist/services/announcement.js +7 -2
  182. package/dist/services/announcement.js.map +1 -1
  183. package/dist/services/assignment.d.ts +293 -293
  184. package/dist/services/assignment.d.ts.map +1 -1
  185. package/dist/services/assignment.js +36 -15
  186. package/dist/services/assignment.js.map +1 -1
  187. package/dist/services/attendance.d.ts +10 -10
  188. package/dist/services/auth.d.ts +2 -2
  189. package/dist/services/class.d.ts +161 -138
  190. package/dist/services/class.d.ts.map +1 -1
  191. package/dist/services/class.js +25 -4
  192. package/dist/services/class.js.map +1 -1
  193. package/dist/services/comment.d.ts +34 -16
  194. package/dist/services/comment.d.ts.map +1 -1
  195. package/dist/services/comment.js +23 -2
  196. package/dist/services/comment.js.map +1 -1
  197. package/dist/services/conversation.d.ts +17 -17
  198. package/dist/services/conversation.d.ts.map +1 -1
  199. package/dist/services/conversation.js +9 -7
  200. package/dist/services/conversation.js.map +1 -1
  201. package/dist/services/department.d.ts +33 -33
  202. package/dist/services/discussion.d.ts +58 -58
  203. package/dist/services/discussion.d.ts.map +1 -1
  204. package/dist/services/discussion.js +8 -8
  205. package/dist/services/discussion.js.map +1 -1
  206. package/dist/services/discussionSummary.d.ts +21 -0
  207. package/dist/services/discussionSummary.d.ts.map +1 -0
  208. package/dist/services/discussionSummary.js +179 -0
  209. package/dist/services/discussionSummary.js.map +1 -0
  210. package/dist/services/embedding.d.ts +67 -0
  211. package/dist/services/embedding.d.ts.map +1 -0
  212. package/dist/services/embedding.js +226 -0
  213. package/dist/services/embedding.js.map +1 -0
  214. package/dist/services/event.d.ts +37 -37
  215. package/dist/services/file.d.ts +24 -24
  216. package/dist/services/folder.d.ts +36 -36
  217. package/dist/services/labChat.d.ts +19 -19
  218. package/dist/services/marketing.d.ts +2 -2
  219. package/dist/services/message.d.ts +11 -11
  220. package/dist/services/message.d.ts.map +1 -1
  221. package/dist/services/message.js +2 -2
  222. package/dist/services/message.js.map +1 -1
  223. package/dist/services/newtonChat.d.ts +4 -4
  224. package/dist/services/notification.d.ts +9 -9
  225. package/dist/services/notification.d.ts.map +1 -1
  226. package/dist/services/permissions.d.ts +14 -14
  227. package/dist/services/school.d.ts +50 -50
  228. package/dist/services/search.d.ts +12 -0
  229. package/dist/services/search.d.ts.map +1 -1
  230. package/dist/services/search.js +120 -2
  231. package/dist/services/search.js.map +1 -1
  232. package/dist/services/section.d.ts +3 -3
  233. package/dist/services/tag.d.ts +4 -4
  234. package/dist/services/user.d.ts +4 -4
  235. package/dist/services/user.d.ts.map +1 -1
  236. package/dist/services/user.js +10 -15
  237. package/dist/services/user.js.map +1 -1
  238. package/dist/services/worksheet.d.ts +62 -47
  239. package/dist/services/worksheet.d.ts.map +1 -1
  240. package/dist/services/worksheet.js +11 -4
  241. package/dist/services/worksheet.js.map +1 -1
  242. package/dist/utils/streamBroadcast.d.ts +11 -0
  243. package/dist/utils/streamBroadcast.d.ts.map +1 -0
  244. package/dist/utils/streamBroadcast.js +32 -0
  245. package/dist/utils/streamBroadcast.js.map +1 -0
  246. package/dist/workers/connection.d.ts +15 -0
  247. package/dist/workers/connection.d.ts.map +1 -1
  248. package/dist/workers/connection.js +20 -2
  249. package/dist/workers/connection.js.map +1 -1
  250. package/dist/workers/index.js +4 -2
  251. package/dist/workers/index.js.map +1 -1
  252. package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
  253. package/dist/workers/processors/createRunJobWorker.js +31 -8
  254. package/dist/workers/processors/createRunJobWorker.js.map +1 -1
  255. package/dist/workers/processors/embedContent.d.ts +8 -0
  256. package/dist/workers/processors/embedContent.d.ts.map +1 -0
  257. package/dist/workers/processors/embedContent.js +76 -0
  258. package/dist/workers/processors/embedContent.js.map +1 -0
  259. package/dist/workers/queues.d.ts +6 -0
  260. package/dist/workers/queues.d.ts.map +1 -1
  261. package/dist/workers/queues.js +5 -3
  262. package/dist/workers/queues.js.map +1 -1
  263. package/package.json +5 -1
  264. package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
  265. package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
  266. package/prisma/schema.prisma +39 -7
  267. package/src/index.ts +4 -0
  268. package/src/lib/config/cors.ts +32 -9
  269. package/src/lib/config/env.ts +6 -0
  270. package/src/lib/googleCloudStorage.ts +21 -0
  271. package/src/lib/prisma.ts +40 -1
  272. package/src/models/class.ts +10 -3
  273. package/src/models/comment.ts +1 -0
  274. package/src/models/conversation.ts +12 -0
  275. package/src/models/worksheet.ts +16 -7
  276. package/src/pipelines/aiLabChat.ts +54 -79
  277. package/src/pipelines/aiLabChatContract.ts +69 -69
  278. package/src/pipelines/aiNewtonChat.ts +46 -43
  279. package/src/pipelines/gradeWorksheet.ts +66 -15
  280. package/src/pipelines/labChatPrompt.ts +63 -88
  281. package/src/routers/_app.ts +2 -0
  282. package/src/routers/announcement.ts +4 -3
  283. package/src/routers/assignment.ts +2 -2
  284. package/src/routers/comment.ts +5 -0
  285. package/src/routers/discussion.ts +7 -0
  286. package/src/routers/embedding.ts +159 -0
  287. package/src/routers/search.ts +10 -1
  288. package/src/routers/worksheet.ts +29 -0
  289. package/src/routes/aiStream.ts +789 -0
  290. package/src/seedDatabase.ts +4 -4
  291. package/src/services/aiChatStream.ts +219 -0
  292. package/src/services/aiModifierTools.ts +188 -0
  293. package/src/services/aiProposalTools.ts +272 -0
  294. package/src/services/aiStream.ts +175 -0
  295. package/src/services/aiTools.ts +290 -0
  296. package/src/services/announcement.ts +7 -0
  297. package/src/services/assignment.ts +36 -14
  298. package/src/services/class.ts +30 -2
  299. package/src/services/comment.ts +22 -0
  300. package/src/services/conversation.ts +9 -4
  301. package/src/services/discussion.ts +9 -8
  302. package/src/services/discussionSummary.ts +226 -0
  303. package/src/services/embedding.ts +285 -0
  304. package/src/services/message.ts +2 -2
  305. package/src/services/search.ts +138 -0
  306. package/src/services/user.ts +9 -17
  307. package/src/services/worksheet.ts +10 -2
  308. package/src/utils/streamBroadcast.ts +48 -0
  309. package/src/workers/connection.ts +19 -0
  310. package/src/workers/index.ts +2 -0
  311. package/src/workers/processors/createRunJobWorker.ts +32 -6
  312. package/src/workers/processors/embedContent.ts +90 -0
  313. package/src/workers/queues.ts +5 -1
  314. package/tests/integration/routers/conversation.test.ts +9 -7
  315. package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
  316. package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
  317. package/prisma/migrations/20250807062924_init/migration.sql +0 -436
  318. package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
  319. package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
  320. package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
  321. package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
  322. package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
  323. package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
  324. package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
  325. package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
  326. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
  327. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
  328. package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
  329. package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
  330. package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
  331. package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
  332. package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
  333. package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
  334. package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
  335. package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
  336. package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
  337. package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
  338. /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
@@ -14,23 +14,23 @@ export declare function postToNewtonChat(userId: string, newtonChatId: string, c
14
14
  id: string;
15
15
  username: string;
16
16
  profile: {
17
- displayName: string | null;
18
17
  profilePicture: string | null;
18
+ displayName: string | null;
19
19
  } | null;
20
20
  };
21
21
  attachments: {
22
22
  path: string;
23
23
  type: string;
24
- name: string;
25
24
  id: string;
25
+ name: string;
26
26
  size: number | null;
27
27
  uploadedAt: Date | null;
28
- uploadStatus: import(".prisma/client").$Enums.UploadStatus;
29
- thumbnailId: string | null;
30
28
  thumbnail: {
31
29
  path: string;
32
30
  id: string;
33
31
  } | null;
32
+ thumbnailId: string | null;
33
+ uploadStatus: import(".prisma/client").$Enums.UploadStatus;
34
34
  }[];
35
35
  mentionedUserIds: string[];
36
36
  }>;
@@ -11,9 +11,9 @@ export declare function listNotifications(userId: string): Promise<({
11
11
  createdAt: Date;
12
12
  title: string;
13
13
  content: string;
14
- senderId: string | null;
15
- receiverId: string;
16
14
  read: boolean;
15
+ receiverId: string;
16
+ senderId: string | null;
17
17
  })[]>;
18
18
  /** Get a single notification by ID for its receiver. */
19
19
  export declare function getNotification(userId: string, id: string): Promise<{
@@ -28,9 +28,9 @@ export declare function getNotification(userId: string, id: string): Promise<{
28
28
  createdAt: Date;
29
29
  title: string;
30
30
  content: string;
31
- senderId: string | null;
32
- receiverId: string;
33
31
  read: boolean;
32
+ receiverId: string;
33
+ senderId: string | null;
34
34
  }>;
35
35
  /** Send a notification to one user. */
36
36
  export declare function sendNotification(input: {
@@ -42,16 +42,16 @@ export declare function sendNotification(input: {
42
42
  createdAt: Date;
43
43
  title: string;
44
44
  content: string;
45
- senderId: string | null;
46
- receiverId: string;
47
45
  read: boolean;
46
+ receiverId: string;
47
+ senderId: string | null;
48
48
  }>;
49
49
  /** Send the same notification to multiple users. */
50
50
  export declare function sendToMultiple(input: {
51
51
  receiverIds: string[];
52
52
  title: string;
53
53
  content: string;
54
- }): Promise<import(".prisma/client").Prisma.BatchPayload>;
54
+ }): Promise<import("@prisma/client/runtime/library.js").GetBatchResult>;
55
55
  /** Mark a notification as read for its receiver. */
56
56
  export declare function markAsRead(userId: string, id: string): Promise<{
57
57
  sender: {
@@ -65,8 +65,8 @@ export declare function markAsRead(userId: string, id: string): Promise<{
65
65
  createdAt: Date;
66
66
  title: string;
67
67
  content: string;
68
- senderId: string | null;
69
- receiverId: string;
70
68
  read: boolean;
69
+ receiverId: string;
70
+ senderId: string | null;
71
71
  }>;
72
72
  //# sourceMappingURL=notification.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"notification.d.ts","sourceRoot":"/","sources":["services/notification.ts"],"names":[],"mappings":"AAYA,qCAAqC;AACrC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;MAErD;AAED,wDAAwD;AACxD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW/D;AAED,uCAAuC;AACvC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;GAEA;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,yDASA;AAED,oDAAoD;AACpD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW1D"}
1
+ {"version":3,"file":"notification.d.ts","sourceRoot":"/","sources":["services/notification.ts"],"names":[],"mappings":"AAYA,qCAAqC;AACrC,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;MAErD;AAED,wDAAwD;AACxD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW/D;AAED,uCAAuC;AACvC,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;;;;;;;;GAEA;AAED,oDAAoD;AACpD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,uEASA;AAED,oDAAoD;AACpD,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;;;;;;;;;;;GAW1D"}
@@ -132,14 +132,14 @@ export declare function grantPermission(grantedById: string, input: {
132
132
  }): Promise<{
133
133
  level: import(".prisma/client").$Enums.PermissionLevel;
134
134
  id: string;
135
+ userId: string | null;
135
136
  createdAt: Date;
136
137
  schoolId: string | null;
137
- userId: string | null;
138
+ classId: string | null;
138
139
  departmentId: string | null;
139
140
  folderId: string;
140
141
  principalType: import(".prisma/client").$Enums.PermissionPrincipalType;
141
142
  tagId: string | null;
142
- classId: string | null;
143
143
  grantedById: string;
144
144
  }>;
145
145
  /** Revoke a grant. Allowed for the granter or anyone with WRITE on the folder. */
@@ -149,8 +149,18 @@ export declare function revokePermission(userId: string, permissionId: string):
149
149
  /** List all explicit grants on a folder. Caller must have WRITE on it. */
150
150
  export declare function listPermissions(userId: string, folderId: string): Promise<({
151
151
  school: {
152
+ id: string;
153
+ name: string;
154
+ } | null;
155
+ department: {
156
+ id: string;
152
157
  name: string;
158
+ color: string | null;
159
+ } | null;
160
+ tag: {
153
161
  id: string;
162
+ name: string;
163
+ color: string;
154
164
  } | null;
155
165
  user: {
156
166
  id: string;
@@ -158,31 +168,21 @@ export declare function listPermissions(userId: string, folderId: string): Promi
158
168
  email: string;
159
169
  } | null;
160
170
  class: {
161
- name: string;
162
- id: string;
163
171
  section: string;
164
- } | null;
165
- department: {
166
- name: string;
167
172
  id: string;
168
- color: string | null;
169
- } | null;
170
- tag: {
171
173
  name: string;
172
- id: string;
173
- color: string;
174
174
  } | null;
175
175
  } & {
176
176
  level: import(".prisma/client").$Enums.PermissionLevel;
177
177
  id: string;
178
+ userId: string | null;
178
179
  createdAt: Date;
179
180
  schoolId: string | null;
180
- userId: string | null;
181
+ classId: string | null;
181
182
  departmentId: string | null;
182
183
  folderId: string;
183
184
  principalType: import(".prisma/client").$Enums.PermissionPrincipalType;
184
185
  tagId: string | null;
185
- classId: string | null;
186
186
  grantedById: string;
187
187
  })[]>;
188
188
  //# sourceMappingURL=permissions.d.ts.map
@@ -15,13 +15,13 @@ export declare function getCurrentSchool(userId: string, schoolId?: string): Pro
15
15
  activeRole: import(".prisma/client").$Enums.SchoolMembershipRole | null;
16
16
  memberships: ({
17
17
  school: {
18
- name: string;
19
18
  id: string;
19
+ createdAt: Date;
20
+ updatedAt: Date;
21
+ name: string;
20
22
  description: string | null;
21
23
  logoId: string | null;
22
24
  subdomain: string | null;
23
- createdAt: Date;
24
- updatedAt: Date;
25
25
  logo: {
26
26
  path: string;
27
27
  type: string;
@@ -31,10 +31,10 @@ export declare function getCurrentSchool(userId: string, schoolId?: string): Pro
31
31
  } & {
32
32
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
33
33
  id: string;
34
+ userId: string;
34
35
  createdAt: Date;
35
36
  updatedAt: Date;
36
37
  schoolId: string;
37
- userId: string;
38
38
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
39
39
  })[];
40
40
  }>;
@@ -48,20 +48,20 @@ export declare function createSchoolRecord(userId: string, input: {
48
48
  memberships: {
49
49
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
50
50
  id: string;
51
+ userId: string;
51
52
  createdAt: Date;
52
53
  updatedAt: Date;
53
54
  schoolId: string;
54
- userId: string;
55
55
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
56
56
  }[];
57
57
  } & {
58
- name: string;
59
58
  id: string;
59
+ createdAt: Date;
60
+ updatedAt: Date;
61
+ name: string;
60
62
  description: string | null;
61
63
  logoId: string | null;
62
64
  subdomain: string | null;
63
- createdAt: Date;
64
- updatedAt: Date;
65
65
  };
66
66
  }>;
67
67
  export declare function updateSchoolDetails(userId: string, input: {
@@ -72,8 +72,8 @@ export declare function updateSchoolDetails(userId: string, input: {
72
72
  logoId?: string | null;
73
73
  }): Promise<{
74
74
  school: {
75
- name: string;
76
75
  id: string;
76
+ name: string;
77
77
  description: string | null;
78
78
  logoId: string | null;
79
79
  subdomain: string | null;
@@ -93,51 +93,51 @@ export declare function getAdminOverview(userId: string, schoolId: string): Prom
93
93
  pendingInvites: number;
94
94
  };
95
95
  recentClasses: {
96
- name: string;
97
- id: string;
98
- subject: string;
99
- color: string | null;
100
96
  section: string;
97
+ id: string;
98
+ name: string;
101
99
  _count: {
102
100
  teachers: number;
103
101
  students: number;
104
102
  };
103
+ color: string | null;
104
+ subject: string;
105
105
  }[];
106
106
  recentInvites: {
107
107
  id: string;
108
108
  createdAt: Date;
109
109
  email: string;
110
- role: import(".prisma/client").$Enums.SchoolMembershipRole;
111
110
  expiresAt: Date;
111
+ role: import(".prisma/client").$Enums.SchoolMembershipRole;
112
112
  }[];
113
113
  };
114
114
  }>;
115
115
  export declare function listClasses(userId: string, schoolId: string): Promise<{
116
116
  classes: ({
117
- _count: {
118
- assignments: number;
119
- teachers: number;
120
- students: number;
121
- };
122
117
  teachers: {
123
118
  id: string;
124
119
  username: string;
125
120
  profile: {
126
- displayName: string | null;
127
121
  profilePicture: string | null;
122
+ displayName: string | null;
128
123
  profilePictureThumbnail: string | null;
129
124
  } | null;
130
125
  }[];
131
126
  students: {
132
127
  id: string;
133
128
  }[];
129
+ _count: {
130
+ teachers: number;
131
+ students: number;
132
+ assignments: number;
133
+ };
134
134
  } & {
135
- name: string;
135
+ section: string;
136
136
  id: string;
137
+ name: string;
137
138
  schoolId: string | null;
138
- subject: string;
139
139
  color: string | null;
140
- section: string;
140
+ subject: string;
141
141
  syllabus: string | null;
142
142
  departmentId: string | null;
143
143
  discussionsEnabled: boolean;
@@ -173,12 +173,12 @@ export declare function createSchoolClass(userId: string, input: {
173
173
  schoolId: string | null;
174
174
  }[];
175
175
  } & {
176
- name: string;
176
+ section: string;
177
177
  id: string;
178
+ name: string;
178
179
  schoolId: string | null;
179
- subject: string;
180
180
  color: string | null;
181
- section: string;
181
+ subject: string;
182
182
  syllabus: string | null;
183
183
  departmentId: string | null;
184
184
  discussionsEnabled: boolean;
@@ -189,19 +189,19 @@ export declare function createSchoolClass(userId: string, input: {
189
189
  export declare function listMembers(userId: string, schoolId: string): Promise<{
190
190
  members: {
191
191
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
192
- id: string;
193
- createdAt: Date;
194
- updatedAt: Date;
195
192
  user: {
196
193
  id: string;
197
194
  username: string;
198
195
  email: string;
199
196
  profile: {
200
- displayName: string | null;
201
197
  profilePicture: string | null;
198
+ displayName: string | null;
202
199
  profilePictureThumbnail: string | null;
203
200
  } | null;
204
201
  };
202
+ id: string;
203
+ createdAt: Date;
204
+ updatedAt: Date;
205
205
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
206
206
  }[];
207
207
  }>;
@@ -213,10 +213,10 @@ export declare function addMember(userId: string, input: {
213
213
  membership: {
214
214
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
215
215
  id: string;
216
+ userId: string;
216
217
  createdAt: Date;
217
218
  updatedAt: Date;
218
219
  schoolId: string;
219
- userId: string;
220
220
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
221
221
  };
222
222
  }>;
@@ -228,10 +228,10 @@ export declare function updateMemberRole(userId: string, input: {
228
228
  membership: {
229
229
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
230
230
  id: string;
231
+ userId: string;
231
232
  createdAt: Date;
232
233
  updatedAt: Date;
233
234
  schoolId: string;
234
- userId: string;
235
235
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
236
236
  };
237
237
  }>;
@@ -247,8 +247,8 @@ export declare function listInvites(userId: string, schoolId: string): Promise<{
247
247
  id: string;
248
248
  createdAt: Date;
249
249
  email: string;
250
- role: import(".prisma/client").$Enums.SchoolMembershipRole;
251
250
  expiresAt: Date;
251
+ role: import(".prisma/client").$Enums.SchoolMembershipRole;
252
252
  acceptedAt: Date | null;
253
253
  revokedAt: Date | null;
254
254
  invitedBy: {
@@ -283,8 +283,8 @@ export declare function searchMembers(userId: string, schoolId: string, query: s
283
283
  id: string;
284
284
  username: string;
285
285
  profile: {
286
- displayName: string | null;
287
286
  profilePicture: string | null;
287
+ displayName: string | null;
288
288
  profilePictureThumbnail: string | null;
289
289
  } | null;
290
290
  schoolMemberships: {
@@ -306,34 +306,34 @@ export declare function getStudentTimeline(userId: string, input: {
306
306
  id: string;
307
307
  username: string;
308
308
  profile: {
309
- displayName: string | null;
310
309
  profilePicture: string | null;
310
+ displayName: string | null;
311
311
  } | null;
312
312
  };
313
313
  events: {
314
- name: string | null;
315
- id: string;
316
314
  class: {
317
- name: string;
318
315
  id: string;
316
+ name: string;
319
317
  color: string | null;
320
318
  } | null;
319
+ id: string;
320
+ location: string | null;
321
+ name: string | null;
321
322
  color: string | null;
322
323
  startTime: Date;
323
324
  endTime: Date;
324
- location: string | null;
325
325
  remarks: string | null;
326
326
  }[];
327
327
  assignments: {
328
328
  type: import(".prisma/client").$Enums.AssignmentType;
329
- id: string;
330
329
  class: {
331
- name: string;
330
+ section: string;
332
331
  id: string;
333
- subject: string;
332
+ name: string;
334
333
  color: string | null;
335
- section: string;
334
+ subject: string;
336
335
  };
336
+ id: string;
337
337
  submissions: {
338
338
  id: string;
339
339
  gradeReceived: number | null;
@@ -343,16 +343,16 @@ export declare function getStudentTimeline(userId: string, input: {
343
343
  }[];
344
344
  title: string;
345
345
  dueDate: Date;
346
- graded: boolean;
347
346
  maxGrade: number | null;
347
+ graded: boolean;
348
348
  weight: number;
349
349
  }[];
350
350
  attendance: {
351
351
  id: string;
352
352
  date: Date;
353
353
  class: {
354
- name: string;
355
354
  id: string;
355
+ name: string;
356
356
  color: string | null;
357
357
  };
358
358
  status: "PRESENT" | "LATE" | "ABSENT";
@@ -370,8 +370,8 @@ export declare function createInvite(userId: string, input: {
370
370
  }): Promise<{
371
371
  invite: {
372
372
  school: {
373
- name: string;
374
373
  id: string;
374
+ name: string;
375
375
  };
376
376
  } & {
377
377
  status: import(".prisma/client").$Enums.SchoolInviteStatus;
@@ -380,9 +380,9 @@ export declare function createInvite(userId: string, input: {
380
380
  updatedAt: Date;
381
381
  email: string;
382
382
  schoolId: string;
383
+ expiresAt: Date;
383
384
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
384
385
  token: string;
385
- expiresAt: Date;
386
386
  acceptedAt: Date | null;
387
387
  revokedAt: Date | null;
388
388
  invitedById: string;
@@ -404,9 +404,9 @@ export declare function revokeInvite(userId: string, input: {
404
404
  updatedAt: Date;
405
405
  email: string;
406
406
  schoolId: string;
407
+ expiresAt: Date;
407
408
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
408
409
  token: string;
409
- expiresAt: Date;
410
410
  acceptedAt: Date | null;
411
411
  revokedAt: Date | null;
412
412
  invitedById: string;
@@ -418,8 +418,8 @@ export declare function getInvite(token: string): Promise<{
418
418
  email: string;
419
419
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
420
420
  school: {
421
- name: string;
422
421
  id: string;
422
+ name: string;
423
423
  };
424
424
  expiresAt: Date;
425
425
  };
@@ -428,10 +428,10 @@ export declare function acceptInvite(userId: string, token: string): Promise<{
428
428
  membership: {
429
429
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
430
430
  id: string;
431
+ userId: string;
431
432
  createdAt: Date;
432
433
  updatedAt: Date;
433
434
  schoolId: string;
434
- userId: string;
435
435
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
436
436
  };
437
437
  }>;
@@ -17,5 +17,17 @@ export declare function searchGlobalClasses(userId: string, input: {
17
17
  query: string;
18
18
  results: SearchResult[];
19
19
  }>;
20
+ /**
21
+ * Cross-class semantic search via pgvector.
22
+ * Generates an embedding for `query`, searches across all classes the user
23
+ * belongs to, and maps hits back to SearchResult shape.
24
+ */
25
+ export declare function searchSemanticGlobal(userId: string, input: {
26
+ query: string;
27
+ limit?: number;
28
+ }): Promise<{
29
+ query: string;
30
+ results: SearchResult[];
31
+ }>;
20
32
  export {};
21
33
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"/","sources":["services/search.ts"],"names":[],"mappings":"AAEA,KAAK,WAAW,GACZ,OAAO,GACP,YAAY,GACZ,OAAO,GACP,UAAU,GACV,WAAW,GACX,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,CAAC;AA6CF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;aA0BR,YAAY,EAAE;GA6ShD"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"/","sources":["services/search.ts"],"names":[],"mappings":"AAKA,KAAK,WAAW,GACZ,OAAO,GACP,YAAY,GACZ,OAAO,GACP,UAAU,GACV,WAAW,GACX,MAAM,GACN,cAAc,GACd,SAAS,CAAC;AAEd,KAAK,YAAY,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,CAAC;AA6CF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;aA0BR,YAAY,EAAE;GA6ShD;AAYD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE;;aAIP,YAAY,EAAE;GAgHhD"}
@@ -1,6 +1,8 @@
1
1
 
2
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="9858c6c3-883b-538a-9404-7b225e24d88e")}catch(e){}}();
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="95067932-0f2f-5d5f-bd33-0e2156d5ed88")}catch(e){}}();
3
3
  import { prisma } from "../lib/prisma.js";
4
+ import { generateEmbedding } from "./embedding.js";
5
+ import { logger } from "../utils/logger.js";
4
6
  const SEARCH_LIMIT = 12;
5
7
  const contains = (query) => ({
6
8
  contains: query,
@@ -348,5 +350,121 @@ export async function searchGlobalClasses(userId, input) {
348
350
  ];
349
351
  return { query, results: trimResults(results, limit) };
350
352
  }
353
+ const SOURCE_TYPE_TO_SCOPE = {
354
+ ASSIGNMENT: "assignment",
355
+ WORKSHEET: "worksheet",
356
+ ANNOUNCEMENT: "announcement",
357
+ FILE: "file",
358
+ SECTION: "section",
359
+ };
360
+ const MIN_SIMILARITY = 0.25;
361
+ /**
362
+ * Cross-class semantic search via pgvector.
363
+ * Generates an embedding for `query`, searches across all classes the user
364
+ * belongs to, and maps hits back to SearchResult shape.
365
+ */
366
+ export async function searchSemanticGlobal(userId, input) {
367
+ const query = input.query.trim().slice(0, 200);
368
+ if (!query) {
369
+ return { query, results: [] };
370
+ }
371
+ const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);
372
+ const memberships = await prisma.class.findMany({
373
+ where: {
374
+ OR: [
375
+ { teachers: { some: { id: userId } } },
376
+ { students: { some: { id: userId } } },
377
+ ],
378
+ },
379
+ select: { id: true, name: true },
380
+ });
381
+ const allClassIds = memberships.map((cls) => cls.id);
382
+ if (allClassIds.length === 0) {
383
+ return { query, results: [] };
384
+ }
385
+ const classById = new Map(memberships.map((cls) => [cls.id, cls]));
386
+ let queryVector;
387
+ try {
388
+ queryVector = await generateEmbedding(query);
389
+ }
390
+ catch (err) {
391
+ logger.error("Semantic search embedding failed", { err });
392
+ return { query, results: [] };
393
+ }
394
+ const vectorStr = `[${queryVector.join(",")}]`;
395
+ const hits = await prisma.$queryRaw `
396
+ SELECT DISTINCT ON ("sourceType", "sourceId")
397
+ "sourceType",
398
+ "sourceId",
399
+ "classId",
400
+ content,
401
+ 1 - (vector <=> ${vectorStr}::vector) as similarity
402
+ FROM "Embedding"
403
+ WHERE "classId" = ANY(${allClassIds}::text[])
404
+ ORDER BY "sourceType", "sourceId", vector <=> ${vectorStr}::vector
405
+ LIMIT ${limit * 3}
406
+ `;
407
+ const filtered = hits
408
+ .filter((h) => h.similarity >= MIN_SIMILARITY)
409
+ .sort((a, b) => b.similarity - a.similarity)
410
+ .slice(0, limit);
411
+ const results = [];
412
+ for (const hit of filtered) {
413
+ const cls = classById.get(hit.classId);
414
+ const className = cls?.name ?? "Class";
415
+ const scope = SOURCE_TYPE_TO_SCOPE[hit.sourceType];
416
+ if (!scope)
417
+ continue;
418
+ const snippet = hit.content.replace(/\s+/g, " ").trim().slice(0, 140);
419
+ let title = snippet.slice(0, 60);
420
+ let href = `/class/${hit.classId}`;
421
+ if (scope === "assignment") {
422
+ const assignment = await prisma.assignment.findUnique({
423
+ where: { id: hit.sourceId },
424
+ select: { title: true },
425
+ });
426
+ title = assignment?.title ?? title;
427
+ href = `/class/${hit.classId}/assignment/${hit.sourceId}`;
428
+ }
429
+ else if (scope === "worksheet") {
430
+ const worksheet = await prisma.worksheet.findUnique({
431
+ where: { id: hit.sourceId },
432
+ select: { name: true },
433
+ });
434
+ title = worksheet?.name ?? title;
435
+ href = `/class/${hit.classId}/worksheets`;
436
+ }
437
+ else if (scope === "announcement") {
438
+ href = `/class/${hit.classId}`;
439
+ }
440
+ else if (scope === "file") {
441
+ const file = await prisma.file.findUnique({
442
+ where: { id: hit.sourceId },
443
+ select: { name: true },
444
+ });
445
+ title = file?.name ?? title;
446
+ href = `/class/${hit.classId}/files`;
447
+ }
448
+ else if (scope === "section") {
449
+ const section = await prisma.section.findUnique({
450
+ where: { id: hit.sourceId },
451
+ select: { name: true },
452
+ });
453
+ title = section?.name ?? title;
454
+ href = `/class/${hit.classId}/assignments`;
455
+ }
456
+ results.push({
457
+ id: `semantic:${hit.sourceId}`,
458
+ type: scope,
459
+ title,
460
+ subtitle: `${className} · ${scope.charAt(0).toUpperCase() + scope.slice(1)}`,
461
+ classId: hit.classId,
462
+ className,
463
+ href,
464
+ matchedText: snippet,
465
+ });
466
+ }
467
+ return { query, results };
468
+ }
351
469
  //# sourceMappingURL=search.js.map
352
- //# debugId=9858c6c3-883b-538a-9404-7b225e24d88e
470
+ //# debugId=95067932-0f2f-5d5f-bd33-0e2156d5ed88