@studious-lms/server 1.13.0 → 1.15.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 (375) 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/instrument.js +3 -3
  8. package/dist/instrument.js.map +1 -1
  9. package/dist/lib/config/cors.d.ts.map +1 -1
  10. package/dist/lib/config/cors.js +31 -11
  11. package/dist/lib/config/cors.js.map +1 -1
  12. package/dist/lib/config/env.d.ts +17 -0
  13. package/dist/lib/config/env.d.ts.map +1 -1
  14. package/dist/lib/config/env.js +8 -2
  15. package/dist/lib/config/env.js.map +1 -1
  16. package/dist/lib/googleCloudStorage.d.ts +10 -0
  17. package/dist/lib/googleCloudStorage.d.ts.map +1 -1
  18. package/dist/lib/googleCloudStorage.js +22 -2
  19. package/dist/lib/googleCloudStorage.js.map +1 -1
  20. package/dist/lib/inferDocumentFormat.d.ts +10 -0
  21. package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
  22. package/dist/lib/inferDocumentFormat.js +48 -0
  23. package/dist/lib/inferDocumentFormat.js.map +1 -0
  24. package/dist/lib/legal.d.ts +3 -0
  25. package/dist/lib/legal.d.ts.map +1 -0
  26. package/dist/lib/legal.js +6 -0
  27. package/dist/lib/legal.js.map +1 -0
  28. package/dist/lib/prisma.d.ts +104 -5
  29. package/dist/lib/prisma.d.ts.map +1 -1
  30. package/dist/lib/prisma.js +33 -2
  31. package/dist/lib/prisma.js.map +1 -1
  32. package/dist/models/agenda.d.ts +20 -20
  33. package/dist/models/announcement.d.ts +211 -101
  34. package/dist/models/announcement.d.ts.map +1 -1
  35. package/dist/models/assignment.d.ts +560 -362
  36. package/dist/models/assignment.d.ts.map +1 -1
  37. package/dist/models/attendance.d.ts +197 -71
  38. package/dist/models/attendance.d.ts.map +1 -1
  39. package/dist/models/auth.d.ts +356 -114
  40. package/dist/models/auth.d.ts.map +1 -1
  41. package/dist/models/auth.js +4 -2
  42. package/dist/models/auth.js.map +1 -1
  43. package/dist/models/class.d.ts +327 -201
  44. package/dist/models/class.d.ts.map +1 -1
  45. package/dist/models/class.js +2 -2
  46. package/dist/models/class.js.map +1 -1
  47. package/dist/models/cloudStorage.d.ts +146 -56
  48. package/dist/models/cloudStorage.d.ts.map +1 -1
  49. package/dist/models/comment.d.ts +262 -110
  50. package/dist/models/comment.d.ts.map +1 -1
  51. package/dist/models/conversation.d.ts +206 -80
  52. package/dist/models/conversation.d.ts.map +1 -1
  53. package/dist/models/department.d.ts +196 -70
  54. package/dist/models/department.d.ts.map +1 -1
  55. package/dist/models/event.d.ts +305 -141
  56. package/dist/models/event.d.ts.map +1 -1
  57. package/dist/models/file.d.ts +422 -272
  58. package/dist/models/file.d.ts.map +1 -1
  59. package/dist/models/folder.d.ts +433 -181
  60. package/dist/models/folder.d.ts.map +1 -1
  61. package/dist/models/labChat.d.ts +205 -79
  62. package/dist/models/labChat.d.ts.map +1 -1
  63. package/dist/models/marketing.d.ts +79 -38
  64. package/dist/models/marketing.d.ts.map +1 -1
  65. package/dist/models/marketing.js +12 -4
  66. package/dist/models/marketing.js.map +1 -1
  67. package/dist/models/message.d.ts +97 -43
  68. package/dist/models/message.d.ts.map +1 -1
  69. package/dist/models/newtonChat.d.ts +84 -30
  70. package/dist/models/newtonChat.d.ts.map +1 -1
  71. package/dist/models/notification.d.ts +57 -21
  72. package/dist/models/notification.d.ts.map +1 -1
  73. package/dist/models/school.d.ts +349 -133
  74. package/dist/models/school.d.ts.map +1 -1
  75. package/dist/models/section.d.ts +216 -72
  76. package/dist/models/section.d.ts.map +1 -1
  77. package/dist/models/tag.d.ts +156 -48
  78. package/dist/models/tag.d.ts.map +1 -1
  79. package/dist/models/user.d.ts +82 -28
  80. package/dist/models/user.d.ts.map +1 -1
  81. package/dist/models/worksheet.d.ts +1032 -423
  82. package/dist/models/worksheet.d.ts.map +1 -1
  83. package/dist/models/worksheet.js +8 -2
  84. package/dist/models/worksheet.js.map +1 -1
  85. package/dist/pipelines/aiLabChat.d.ts +7 -9
  86. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  87. package/dist/pipelines/aiLabChat.js +194 -125
  88. package/dist/pipelines/aiLabChat.js.map +1 -1
  89. package/dist/pipelines/aiLabChatContract.d.ts +233 -389
  90. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  91. package/dist/pipelines/aiLabChatContract.js +54 -70
  92. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  93. package/dist/pipelines/aiNewtonChat.d.ts.map +1 -1
  94. package/dist/pipelines/aiNewtonChat.js +41 -41
  95. package/dist/pipelines/aiNewtonChat.js.map +1 -1
  96. package/dist/pipelines/gradeWorksheet.d.ts +8 -8
  97. package/dist/pipelines/labChatPrompt.d.ts +18 -11
  98. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  99. package/dist/pipelines/labChatPrompt.js +93 -75
  100. package/dist/pipelines/labChatPrompt.js.map +1 -1
  101. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  102. package/dist/routers/_app.d.ts +2601 -2151
  103. package/dist/routers/_app.d.ts.map +1 -1
  104. package/dist/routers/_app.js +4 -2
  105. package/dist/routers/_app.js.map +1 -1
  106. package/dist/routers/admin.d.ts +13 -13
  107. package/dist/routers/agenda.d.ts +18 -18
  108. package/dist/routers/announcement.d.ts +60 -60
  109. package/dist/routers/assignment.d.ts +393 -383
  110. package/dist/routers/assignment.d.ts.map +1 -1
  111. package/dist/routers/attendance.d.ts +10 -10
  112. package/dist/routers/auth.d.ts +4 -2
  113. package/dist/routers/auth.d.ts.map +1 -1
  114. package/dist/routers/auth.js +15 -2
  115. package/dist/routers/auth.js.map +1 -1
  116. package/dist/routers/class.d.ts +157 -153
  117. package/dist/routers/class.d.ts.map +1 -1
  118. package/dist/routers/comment.d.ts +18 -18
  119. package/dist/routers/conversation.d.ts +11 -11
  120. package/dist/routers/department.d.ts +34 -34
  121. package/dist/routers/discussion.d.ts +68 -56
  122. package/dist/routers/discussion.d.ts.map +1 -1
  123. package/dist/routers/discussion.js +6 -2
  124. package/dist/routers/discussion.js.map +1 -1
  125. package/dist/routers/embedding.d.ts +73 -0
  126. package/dist/routers/embedding.d.ts.map +1 -0
  127. package/dist/routers/embedding.js +151 -0
  128. package/dist/routers/embedding.js.map +1 -0
  129. package/dist/routers/event.d.ts +57 -55
  130. package/dist/routers/event.d.ts.map +1 -1
  131. package/dist/routers/file.d.ts +14 -14
  132. package/dist/routers/folder.d.ts +38 -38
  133. package/dist/routers/labChat.d.ts +16 -16
  134. package/dist/routers/marketing.d.ts +1 -14
  135. package/dist/routers/marketing.d.ts.map +1 -1
  136. package/dist/routers/message.d.ts +13 -13
  137. package/dist/routers/newtonChat.d.ts +4 -4
  138. package/dist/routers/notifications.d.ts +5 -5
  139. package/dist/routers/permissions.d.ts +14 -14
  140. package/dist/routers/school.d.ts +59 -55
  141. package/dist/routers/school.d.ts.map +1 -1
  142. package/dist/routers/search.d.ts +22 -1
  143. package/dist/routers/search.d.ts.map +1 -1
  144. package/dist/routers/search.js +9 -3
  145. package/dist/routers/search.js.map +1 -1
  146. package/dist/routers/section.d.ts +4 -4
  147. package/dist/routers/studentProgress.d.ts +1 -1
  148. package/dist/routers/tag.d.ts +7 -7
  149. package/dist/routers/user.d.ts +99 -10
  150. package/dist/routers/user.d.ts.map +1 -1
  151. package/dist/routers/user.js +19 -2
  152. package/dist/routers/user.js.map +1 -1
  153. package/dist/routers/worksheet.d.ts +93 -55
  154. package/dist/routers/worksheet.d.ts.map +1 -1
  155. package/dist/routers/worksheet.js +26 -2
  156. package/dist/routers/worksheet.js.map +1 -1
  157. package/dist/routes/aiStream.d.ts +2 -0
  158. package/dist/routes/aiStream.d.ts.map +1 -0
  159. package/dist/routes/aiStream.js +726 -0
  160. package/dist/routes/aiStream.js.map +1 -0
  161. package/dist/seedDatabase.d.ts +3 -1
  162. package/dist/seedDatabase.d.ts.map +1 -1
  163. package/dist/seedDatabase.js +6 -6
  164. package/dist/seedDatabase.js.map +1 -1
  165. package/dist/services/adminInstitution.d.ts +8 -8
  166. package/dist/services/adminRunJob.d.ts +4 -4
  167. package/dist/services/agenda.d.ts +18 -18
  168. package/dist/services/aiChatStream.d.ts +88 -0
  169. package/dist/services/aiChatStream.d.ts.map +1 -0
  170. package/dist/services/aiChatStream.js +254 -0
  171. package/dist/services/aiChatStream.js.map +1 -0
  172. package/dist/services/aiModifierTools.d.ts +16 -0
  173. package/dist/services/aiModifierTools.d.ts.map +1 -0
  174. package/dist/services/aiModifierTools.js +274 -0
  175. package/dist/services/aiModifierTools.js.map +1 -0
  176. package/dist/services/aiProposalTools.d.ts +32 -0
  177. package/dist/services/aiProposalTools.d.ts.map +1 -0
  178. package/dist/services/aiProposalTools.js +207 -0
  179. package/dist/services/aiProposalTools.js.map +1 -0
  180. package/dist/services/aiStream.d.ts +22 -0
  181. package/dist/services/aiStream.d.ts.map +1 -0
  182. package/dist/services/aiStream.js +142 -0
  183. package/dist/services/aiStream.js.map +1 -0
  184. package/dist/services/aiTools.d.ts +16 -0
  185. package/dist/services/aiTools.d.ts.map +1 -0
  186. package/dist/services/aiTools.js +271 -0
  187. package/dist/services/aiTools.js.map +1 -0
  188. package/dist/services/announcement.d.ts +42 -42
  189. package/dist/services/announcement.d.ts.map +1 -1
  190. package/dist/services/announcement.js +7 -2
  191. package/dist/services/announcement.js.map +1 -1
  192. package/dist/services/assignment.d.ts +355 -345
  193. package/dist/services/assignment.d.ts.map +1 -1
  194. package/dist/services/assignment.js +30 -9
  195. package/dist/services/assignment.js.map +1 -1
  196. package/dist/services/attendance.d.ts +10 -10
  197. package/dist/services/auth.d.ts +4 -2
  198. package/dist/services/auth.d.ts.map +1 -1
  199. package/dist/services/auth.js +13 -4
  200. package/dist/services/auth.js.map +1 -1
  201. package/dist/services/class.d.ts +146 -142
  202. package/dist/services/class.d.ts.map +1 -1
  203. package/dist/services/class.js +24 -4
  204. package/dist/services/class.js.map +1 -1
  205. package/dist/services/comment.d.ts +18 -18
  206. package/dist/services/conversation.d.ts +11 -11
  207. package/dist/services/department.d.ts +33 -33
  208. package/dist/services/discussion.d.ts +58 -58
  209. package/dist/services/discussion.d.ts.map +1 -1
  210. package/dist/services/discussion.js +15 -8
  211. package/dist/services/discussion.js.map +1 -1
  212. package/dist/services/discussionSummary.d.ts +21 -0
  213. package/dist/services/discussionSummary.d.ts.map +1 -0
  214. package/dist/services/discussionSummary.js +179 -0
  215. package/dist/services/discussionSummary.js.map +1 -0
  216. package/dist/services/embedding.d.ts +85 -0
  217. package/dist/services/embedding.d.ts.map +1 -0
  218. package/dist/services/embedding.js +372 -0
  219. package/dist/services/embedding.js.map +1 -0
  220. package/dist/services/event.d.ts +55 -53
  221. package/dist/services/event.d.ts.map +1 -1
  222. package/dist/services/file.d.ts +28 -28
  223. package/dist/services/folder.d.ts +36 -36
  224. package/dist/services/folder.d.ts.map +1 -1
  225. package/dist/services/folder.js +32 -2
  226. package/dist/services/folder.js.map +1 -1
  227. package/dist/services/labChat.d.ts +16 -16
  228. package/dist/services/marketing.d.ts +2 -15
  229. package/dist/services/marketing.d.ts.map +1 -1
  230. package/dist/services/marketing.js +5 -5
  231. package/dist/services/marketing.js.map +1 -1
  232. package/dist/services/message.d.ts +11 -11
  233. package/dist/services/message.d.ts.map +1 -1
  234. package/dist/services/message.js +2 -2
  235. package/dist/services/message.js.map +1 -1
  236. package/dist/services/newtonChat.d.ts +4 -4
  237. package/dist/services/notification.d.ts +5 -5
  238. package/dist/services/notification.d.ts.map +1 -1
  239. package/dist/services/openaiDocumentGen.d.ts +37 -0
  240. package/dist/services/openaiDocumentGen.d.ts.map +1 -0
  241. package/dist/services/openaiDocumentGen.js +262 -0
  242. package/dist/services/openaiDocumentGen.js.map +1 -0
  243. package/dist/services/permissions.d.ts +14 -14
  244. package/dist/services/school.d.ts +54 -50
  245. package/dist/services/school.d.ts.map +1 -1
  246. package/dist/services/search.d.ts +13 -1
  247. package/dist/services/search.d.ts.map +1 -1
  248. package/dist/services/search.js +145 -2
  249. package/dist/services/search.js.map +1 -1
  250. package/dist/services/section.d.ts +3 -3
  251. package/dist/services/tag.d.ts +4 -4
  252. package/dist/services/user.d.ts +4 -4
  253. package/dist/services/user.d.ts.map +1 -1
  254. package/dist/services/user.js +10 -15
  255. package/dist/services/user.js.map +1 -1
  256. package/dist/services/userPrivacy.d.ts +86 -0
  257. package/dist/services/userPrivacy.d.ts.map +1 -0
  258. package/dist/services/userPrivacy.js +184 -0
  259. package/dist/services/userPrivacy.js.map +1 -0
  260. package/dist/services/worksheet.d.ts +86 -57
  261. package/dist/services/worksheet.d.ts.map +1 -1
  262. package/dist/services/worksheet.js +57 -5
  263. package/dist/services/worksheet.js.map +1 -1
  264. package/dist/utils/email.d.ts.map +1 -1
  265. package/dist/utils/email.js +7 -3
  266. package/dist/utils/email.js.map +1 -1
  267. package/dist/utils/streamBroadcast.d.ts +11 -0
  268. package/dist/utils/streamBroadcast.d.ts.map +1 -0
  269. package/dist/utils/streamBroadcast.js +32 -0
  270. package/dist/utils/streamBroadcast.js.map +1 -0
  271. package/dist/workers/connection.d.ts +15 -0
  272. package/dist/workers/connection.d.ts.map +1 -1
  273. package/dist/workers/connection.js +20 -2
  274. package/dist/workers/connection.js.map +1 -1
  275. package/dist/workers/index.js +4 -2
  276. package/dist/workers/index.js.map +1 -1
  277. package/dist/workers/processors/createRunJobWorker.d.ts.map +1 -1
  278. package/dist/workers/processors/createRunJobWorker.js +31 -8
  279. package/dist/workers/processors/createRunJobWorker.js.map +1 -1
  280. package/dist/workers/processors/embedContent.d.ts +8 -0
  281. package/dist/workers/processors/embedContent.d.ts.map +1 -0
  282. package/dist/workers/processors/embedContent.js +67 -0
  283. package/dist/workers/processors/embedContent.js.map +1 -0
  284. package/dist/workers/queues.d.ts +6 -0
  285. package/dist/workers/queues.d.ts.map +1 -1
  286. package/dist/workers/queues.js +5 -3
  287. package/dist/workers/queues.js.map +1 -1
  288. package/package.json +5 -1
  289. package/prisma/migrations/20260609215135_init/migration.sql +1412 -0
  290. package/prisma/migrations/20260610130000_add_worksheet_tags/migration.sql +13 -0
  291. package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
  292. package/prisma/migrations/20260611120000_add_user_terms_acceptance/migration.sql +3 -0
  293. package/prisma/schema.prisma +44 -7
  294. package/src/index.ts +4 -0
  295. package/src/instrument.ts +1 -1
  296. package/src/lib/config/cors.ts +32 -9
  297. package/src/lib/config/env.ts +6 -0
  298. package/src/lib/googleCloudStorage.ts +21 -0
  299. package/src/lib/inferDocumentFormat.ts +58 -0
  300. package/src/lib/legal.ts +2 -0
  301. package/src/lib/prisma.ts +40 -1
  302. package/src/models/auth.ts +4 -0
  303. package/src/models/class.ts +3 -2
  304. package/src/models/marketing.ts +10 -2
  305. package/src/models/worksheet.ts +5 -2
  306. package/src/pipelines/aiLabChat.ts +245 -146
  307. package/src/pipelines/aiLabChatContract.ts +59 -69
  308. package/src/pipelines/aiNewtonChat.ts +46 -43
  309. package/src/pipelines/labChatPrompt.ts +115 -90
  310. package/src/routers/_app.ts +2 -0
  311. package/src/routers/auth.ts +13 -0
  312. package/src/routers/discussion.ts +7 -0
  313. package/src/routers/embedding.ts +164 -0
  314. package/src/routers/search.ts +10 -1
  315. package/src/routers/user.ts +26 -0
  316. package/src/routers/worksheet.ts +27 -0
  317. package/src/routes/aiStream.ts +827 -0
  318. package/src/seedDatabase.ts +4 -4
  319. package/src/services/aiChatStream.ts +341 -0
  320. package/src/services/aiModifierTools.ts +341 -0
  321. package/src/services/aiProposalTools.ts +274 -0
  322. package/src/services/aiStream.ts +175 -0
  323. package/src/services/aiTools.ts +290 -0
  324. package/src/services/announcement.ts +7 -0
  325. package/src/services/assignment.ts +31 -7
  326. package/src/services/auth.ts +14 -2
  327. package/src/services/class.ts +27 -2
  328. package/src/services/discussion.ts +22 -8
  329. package/src/services/discussionSummary.ts +226 -0
  330. package/src/services/embedding.ts +446 -0
  331. package/src/services/folder.ts +31 -0
  332. package/src/services/marketing.ts +3 -3
  333. package/src/services/message.ts +2 -2
  334. package/src/services/openaiDocumentGen.ts +319 -0
  335. package/src/services/search.ts +163 -1
  336. package/src/services/user.ts +9 -17
  337. package/src/services/userPrivacy.ts +196 -0
  338. package/src/services/worksheet.ts +77 -3
  339. package/src/utils/email.ts +5 -1
  340. package/src/utils/streamBroadcast.ts +48 -0
  341. package/src/workers/connection.ts +19 -0
  342. package/src/workers/index.ts +2 -0
  343. package/src/workers/processors/createRunJobWorker.ts +32 -6
  344. package/src/workers/processors/embedContent.ts +86 -0
  345. package/src/workers/queues.ts +5 -1
  346. package/tests/helpers/registerInput.ts +20 -0
  347. package/tests/integration/globalSetup.ts +10 -18
  348. package/tests/integration/routers/auth.test.ts +13 -18
  349. package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
  350. package/tests/unit/pipelines/aiLabChatContract.test.ts +38 -21
  351. package/tests/unit/pipelines/labChatPrompt.test.ts +23 -36
  352. package/tests/unit/services/aiChatStream.test.ts +92 -0
  353. package/tests/unit/services/openaiDocumentGen.test.ts +65 -0
  354. package/prisma/migrations/20250807062924_init/migration.sql +0 -436
  355. package/prisma/migrations/20250919063704_init2/migration.sql +0 -24
  356. package/prisma/migrations/20250920143543_add_profile_fields/migration.sql +0 -15
  357. package/prisma/migrations/20250922165147_add_chat_models/migration.sql +0 -68
  358. package/prisma/migrations/20250922165314_add_chat_roles/migration.sql +0 -5
  359. package/prisma/migrations/20250922171242_refactor_notification_system/migration.sql +0 -20
  360. package/prisma/migrations/20250922172208_add_mentions_system/migration.sql +0 -21
  361. package/prisma/migrations/20250925072732_add_lab_chat_system/migration.sql +0 -25
  362. package/prisma/migrations/20251020151505_add_upload_tracking_fields/migration.sql +0 -57
  363. package/prisma/migrations/20251109122857_annuoncements_comments/migration.sql +0 -30
  364. package/prisma/migrations/20251109135555_reactions_announcements_comments/migration.sql +0 -35
  365. package/prisma/migrations/20260410124000_add_submission_recommendation_state/migration.sql +0 -14
  366. package/prisma/migrations/20260415103500_add_session_type/migration.sql +0 -33
  367. package/prisma/migrations/20260415133000_add_ai_usage_logs/migration.sql +0 -19
  368. package/prisma/migrations/20260417083000_add_conversation_member_hidden_at/migration.sql +0 -2
  369. package/prisma/migrations/20260502230500_assignment_submission_comments/migration.sql +0 -60
  370. package/prisma/migrations/20260504071500_school_memberships/migration.sql +0 -81
  371. package/prisma/migrations/20260506162500_consolidate_run_job_and_unify_job_status/migration.sql +0 -166
  372. package/prisma/migrations/20260509220000_institution_overhaul/migration.sql +0 -184
  373. package/prisma/migrations/20260510170000_add_folder_permissions/migration.sql +0 -93
  374. package/prisma/migrations/20260510183000_add_discussions/migration.sql +0 -151
  375. /package/.github/workflows/{npm.yml → npm-publish.yml} +0 -0
@@ -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;
@@ -162,6 +162,8 @@ export declare function createSchoolClass(userId: string, input: {
162
162
  email: string;
163
163
  password: string;
164
164
  verified: boolean;
165
+ termsAcceptedAt: Date | null;
166
+ termsVersion: string | null;
165
167
  schoolId: string | null;
166
168
  }[];
167
169
  students: {
@@ -170,15 +172,17 @@ export declare function createSchoolClass(userId: string, input: {
170
172
  email: string;
171
173
  password: string;
172
174
  verified: boolean;
175
+ termsAcceptedAt: Date | null;
176
+ termsVersion: string | null;
173
177
  schoolId: string | null;
174
178
  }[];
175
179
  } & {
176
- name: string;
180
+ section: string;
177
181
  id: string;
182
+ name: string;
178
183
  schoolId: string | null;
179
- subject: string;
180
184
  color: string | null;
181
- section: string;
185
+ subject: string;
182
186
  syllabus: string | null;
183
187
  departmentId: string | null;
184
188
  discussionsEnabled: boolean;
@@ -189,19 +193,19 @@ export declare function createSchoolClass(userId: string, input: {
189
193
  export declare function listMembers(userId: string, schoolId: string): Promise<{
190
194
  members: {
191
195
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
192
- id: string;
193
- createdAt: Date;
194
- updatedAt: Date;
195
196
  user: {
196
197
  id: string;
197
198
  username: string;
198
199
  email: string;
199
200
  profile: {
200
- displayName: string | null;
201
201
  profilePicture: string | null;
202
+ displayName: string | null;
202
203
  profilePictureThumbnail: string | null;
203
204
  } | null;
204
205
  };
206
+ id: string;
207
+ createdAt: Date;
208
+ updatedAt: Date;
205
209
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
206
210
  }[];
207
211
  }>;
@@ -213,10 +217,10 @@ export declare function addMember(userId: string, input: {
213
217
  membership: {
214
218
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
215
219
  id: string;
220
+ userId: string;
216
221
  createdAt: Date;
217
222
  updatedAt: Date;
218
223
  schoolId: string;
219
- userId: string;
220
224
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
221
225
  };
222
226
  }>;
@@ -228,10 +232,10 @@ export declare function updateMemberRole(userId: string, input: {
228
232
  membership: {
229
233
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
230
234
  id: string;
235
+ userId: string;
231
236
  createdAt: Date;
232
237
  updatedAt: Date;
233
238
  schoolId: string;
234
- userId: string;
235
239
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
236
240
  };
237
241
  }>;
@@ -247,8 +251,8 @@ export declare function listInvites(userId: string, schoolId: string): Promise<{
247
251
  id: string;
248
252
  createdAt: Date;
249
253
  email: string;
250
- role: import(".prisma/client").$Enums.SchoolMembershipRole;
251
254
  expiresAt: Date;
255
+ role: import(".prisma/client").$Enums.SchoolMembershipRole;
252
256
  acceptedAt: Date | null;
253
257
  revokedAt: Date | null;
254
258
  invitedBy: {
@@ -283,8 +287,8 @@ export declare function searchMembers(userId: string, schoolId: string, query: s
283
287
  id: string;
284
288
  username: string;
285
289
  profile: {
286
- displayName: string | null;
287
290
  profilePicture: string | null;
291
+ displayName: string | null;
288
292
  profilePictureThumbnail: string | null;
289
293
  } | null;
290
294
  schoolMemberships: {
@@ -306,34 +310,34 @@ export declare function getStudentTimeline(userId: string, input: {
306
310
  id: string;
307
311
  username: string;
308
312
  profile: {
309
- displayName: string | null;
310
313
  profilePicture: string | null;
314
+ displayName: string | null;
311
315
  } | null;
312
316
  };
313
317
  events: {
314
- name: string | null;
315
- id: string;
316
318
  class: {
317
- name: string;
318
319
  id: string;
320
+ name: string;
319
321
  color: string | null;
320
322
  } | null;
323
+ id: string;
324
+ location: string | null;
325
+ name: string | null;
321
326
  color: string | null;
322
327
  startTime: Date;
323
328
  endTime: Date;
324
- location: string | null;
325
329
  remarks: string | null;
326
330
  }[];
327
331
  assignments: {
328
332
  type: import(".prisma/client").$Enums.AssignmentType;
329
- id: string;
330
333
  class: {
331
- name: string;
334
+ section: string;
332
335
  id: string;
333
- subject: string;
336
+ name: string;
334
337
  color: string | null;
335
- section: string;
338
+ subject: string;
336
339
  };
340
+ id: string;
337
341
  submissions: {
338
342
  id: string;
339
343
  gradeReceived: number | null;
@@ -343,16 +347,16 @@ export declare function getStudentTimeline(userId: string, input: {
343
347
  }[];
344
348
  title: string;
345
349
  dueDate: Date;
346
- graded: boolean;
347
350
  maxGrade: number | null;
351
+ graded: boolean;
348
352
  weight: number;
349
353
  }[];
350
354
  attendance: {
351
355
  id: string;
352
356
  date: Date;
353
357
  class: {
354
- name: string;
355
358
  id: string;
359
+ name: string;
356
360
  color: string | null;
357
361
  };
358
362
  status: "PRESENT" | "LATE" | "ABSENT";
@@ -370,8 +374,8 @@ export declare function createInvite(userId: string, input: {
370
374
  }): Promise<{
371
375
  invite: {
372
376
  school: {
373
- name: string;
374
377
  id: string;
378
+ name: string;
375
379
  };
376
380
  } & {
377
381
  status: import(".prisma/client").$Enums.SchoolInviteStatus;
@@ -380,9 +384,9 @@ export declare function createInvite(userId: string, input: {
380
384
  updatedAt: Date;
381
385
  email: string;
382
386
  schoolId: string;
387
+ expiresAt: Date;
383
388
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
384
389
  token: string;
385
- expiresAt: Date;
386
390
  acceptedAt: Date | null;
387
391
  revokedAt: Date | null;
388
392
  invitedById: string;
@@ -404,9 +408,9 @@ export declare function revokeInvite(userId: string, input: {
404
408
  updatedAt: Date;
405
409
  email: string;
406
410
  schoolId: string;
411
+ expiresAt: Date;
407
412
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
408
413
  token: string;
409
- expiresAt: Date;
410
414
  acceptedAt: Date | null;
411
415
  revokedAt: Date | null;
412
416
  invitedById: string;
@@ -418,8 +422,8 @@ export declare function getInvite(token: string): Promise<{
418
422
  email: string;
419
423
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
420
424
  school: {
421
- name: string;
422
425
  id: string;
426
+ name: string;
423
427
  };
424
428
  expiresAt: Date;
425
429
  };
@@ -428,10 +432,10 @@ export declare function acceptInvite(userId: string, token: string): Promise<{
428
432
  membership: {
429
433
  status: import(".prisma/client").$Enums.SchoolMembershipStatus;
430
434
  id: string;
435
+ userId: string;
431
436
  createdAt: Date;
432
437
  updatedAt: Date;
433
438
  schoolId: string;
434
- userId: string;
435
439
  role: import(".prisma/client").$Enums.SchoolMembershipRole;
436
440
  };
437
441
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["services/school.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"school.d.ts","sourceRoot":"/","sources":["services/school.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,oBAAoB,EAAe,MAAM,gBAAgB,CAAC;AA4DnE,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyBvE;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;;;;;;;;;;;;;;;;;;;;GAcF;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;;;;;;;;GAUF;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BtE;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjE;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCF;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;GAGjE;AAED,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE;;;;;;;;;;GAS9E;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE;;;;;;;;;;GAwB9E;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE;;GAoBlD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;GAGjE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,4DAchE;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,OAAO;;GAKvB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,qBAOnE;AAED,4EAA4E;AAC5E,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS;;;;;;;;;;;KA2CvC;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;CACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyIF;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,oBAAoB,CAAC;IAC3B;sEACkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;;;;;;;;;;;;;;;;;;;;;;;;;GAkGF;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;GAI9C;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;GAiB5C;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;;;;;;;;;;GAsB/D"}
@@ -1,4 +1,4 @@
1
- type SearchScope = "class" | "assignment" | "event" | "syllabus" | "worksheet" | "file" | "announcement" | "section";
1
+ type SearchScope = "class" | "assignment" | "event" | "syllabus" | "worksheet" | "file" | "announcement" | "section" | "discussion" | "submission";
2
2
  type SearchResult = {
3
3
  id: string;
4
4
  type: SearchScope;
@@ -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,GACT,YAAY,GACZ,YAAY,CAAC;AAEjB,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;AA+CF,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;AAeD;;;;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;GAiIhD"}
@@ -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]="cb499420-fdcc-5847-9586-9b9927cf72a2")}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,
@@ -33,6 +35,8 @@ const trimResults = (results, limit) => results
33
35
  file: 5,
34
36
  announcement: 6,
35
37
  section: 7,
38
+ discussion: 8,
39
+ submission: 9,
36
40
  };
37
41
  const priorityDiff = priority[a.type] - priority[b.type];
38
42
  if (priorityDiff !== 0)
@@ -348,5 +352,144 @@ export async function searchGlobalClasses(userId, input) {
348
352
  ];
349
353
  return { query, results: trimResults(results, limit) };
350
354
  }
355
+ const SOURCE_TYPE_TO_SCOPE = {
356
+ ASSIGNMENT: "assignment",
357
+ WORKSHEET: "worksheet",
358
+ ANNOUNCEMENT: "announcement",
359
+ FILE: "file",
360
+ SECTION: "section",
361
+ DISCUSSION: "discussion",
362
+ SUBMISSION: "submission",
363
+ SYLLABUS: "syllabus",
364
+ };
365
+ const MIN_SIMILARITY = 0.25;
366
+ /**
367
+ * Cross-class semantic search via pgvector.
368
+ * Generates an embedding for `query`, searches across all classes the user
369
+ * belongs to, and maps hits back to SearchResult shape.
370
+ */
371
+ export async function searchSemanticGlobal(userId, input) {
372
+ const query = input.query.trim().slice(0, 200);
373
+ if (!query) {
374
+ return { query, results: [] };
375
+ }
376
+ const limit = Math.min(Math.max(input.limit ?? SEARCH_LIMIT, 1), 30);
377
+ const memberships = await prisma.class.findMany({
378
+ where: {
379
+ OR: [
380
+ { teachers: { some: { id: userId } } },
381
+ { students: { some: { id: userId } } },
382
+ ],
383
+ },
384
+ select: { id: true, name: true },
385
+ });
386
+ const allClassIds = memberships.map((cls) => cls.id);
387
+ if (allClassIds.length === 0) {
388
+ return { query, results: [] };
389
+ }
390
+ const classById = new Map(memberships.map((cls) => [cls.id, cls]));
391
+ let queryVector;
392
+ try {
393
+ queryVector = await generateEmbedding(query);
394
+ }
395
+ catch (err) {
396
+ logger.error("Semantic search embedding failed", { err });
397
+ return { query, results: [] };
398
+ }
399
+ const vectorStr = `[${queryVector.join(",")}]`;
400
+ const hits = await prisma.$queryRaw `
401
+ SELECT DISTINCT ON ("sourceType", "sourceId")
402
+ "sourceType",
403
+ "sourceId",
404
+ "classId",
405
+ content,
406
+ 1 - (vector <=> ${vectorStr}::vector) as similarity
407
+ FROM "Embedding"
408
+ WHERE "classId" = ANY(${allClassIds}::text[])
409
+ ORDER BY "sourceType", "sourceId", vector <=> ${vectorStr}::vector
410
+ LIMIT ${limit * 3}
411
+ `;
412
+ const filtered = hits
413
+ .filter((h) => h.similarity >= MIN_SIMILARITY)
414
+ .sort((a, b) => b.similarity - a.similarity)
415
+ .slice(0, limit);
416
+ const results = [];
417
+ for (const hit of filtered) {
418
+ const cls = classById.get(hit.classId);
419
+ const className = cls?.name ?? "Class";
420
+ const scope = SOURCE_TYPE_TO_SCOPE[hit.sourceType];
421
+ if (!scope)
422
+ continue;
423
+ const snippet = hit.content.replace(/\s+/g, " ").trim().slice(0, 140);
424
+ let title = snippet.slice(0, 60);
425
+ let href = `/class/${hit.classId}`;
426
+ if (scope === "assignment") {
427
+ const assignment = await prisma.assignment.findUnique({
428
+ where: { id: hit.sourceId },
429
+ select: { title: true },
430
+ });
431
+ title = assignment?.title ?? title;
432
+ href = `/class/${hit.classId}/assignment/${hit.sourceId}`;
433
+ }
434
+ else if (scope === "worksheet") {
435
+ const worksheet = await prisma.worksheet.findUnique({
436
+ where: { id: hit.sourceId },
437
+ select: { name: true },
438
+ });
439
+ title = worksheet?.name ?? title;
440
+ href = `/class/${hit.classId}/worksheets`;
441
+ }
442
+ else if (scope === "announcement") {
443
+ href = `/class/${hit.classId}`;
444
+ }
445
+ else if (scope === "file") {
446
+ const file = await prisma.file.findUnique({
447
+ where: { id: hit.sourceId },
448
+ select: { name: true },
449
+ });
450
+ title = file?.name ?? title;
451
+ href = `/class/${hit.classId}/files`;
452
+ }
453
+ else if (scope === "section") {
454
+ const section = await prisma.section.findUnique({
455
+ where: { id: hit.sourceId },
456
+ select: { name: true },
457
+ });
458
+ title = section?.name ?? title;
459
+ href = `/class/${hit.classId}/assignments`;
460
+ }
461
+ else if (scope === "discussion") {
462
+ const discussion = await prisma.discussion.findUnique({
463
+ where: { id: hit.sourceId },
464
+ select: { title: true },
465
+ });
466
+ title = discussion?.title ?? title;
467
+ href = `/class/${hit.classId}/discussions/${hit.sourceId}`;
468
+ }
469
+ else if (scope === "submission") {
470
+ const submission = await prisma.submission.findUnique({
471
+ where: { id: hit.sourceId },
472
+ select: { assignment: { select: { title: true, id: true } } },
473
+ });
474
+ title = submission?.assignment.title ? `Submission: ${submission.assignment.title}` : title;
475
+ href = submission?.assignment.id ? `/class/${hit.classId}/assignment/${submission.assignment.id}` : href;
476
+ }
477
+ else if (scope === "syllabus") {
478
+ title = `${className} Syllabus`;
479
+ href = `/class/${hit.classId}/syllabus`;
480
+ }
481
+ results.push({
482
+ id: `semantic:${hit.sourceId}`,
483
+ type: scope,
484
+ title,
485
+ subtitle: `${className} · ${scope.charAt(0).toUpperCase() + scope.slice(1)}`,
486
+ classId: hit.classId,
487
+ className,
488
+ href,
489
+ matchedText: snippet,
490
+ });
491
+ }
492
+ return { query, results };
493
+ }
351
494
  //# sourceMappingURL=search.js.map
352
- //# debugId=9858c6c3-883b-538a-9404-7b225e24d88e
495
+ //# debugId=cb499420-fdcc-5847-9586-9b9927cf72a2