@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiStream.js","sources":["routes/aiStream.ts"],"sourceRoot":"/","sourcesContent":["/**\n * Express routes for AI streaming endpoints.\n * These routes use the Vercel AI SDK's data stream protocol for streaming AI responses.\n */\nimport { Router } from 'express';\nimport type { Request, Response } from 'express';\nimport { streamText, stepCountIs, type ModelMessage } from 'ai';\nimport { openai } from '@ai-sdk/openai';\nimport { findUserBySessionToken } from '../models/auth.js';\nimport { prisma } from '../lib/prisma.js';\nimport { logger } from '../utils/logger.js';\nimport { aiTools } from '../services/aiTools.js';\nimport {\n assignmentModifierTools,\n worksheetModifierTools,\n type ModifierFieldUpdate,\n} from '../services/aiModifierTools.js';\nimport { getRedis } from '../lib/redis.js';\nimport { pusher, chatChannel, teacherChannel } from '../lib/pusher.js';\nimport { getAIUserId, ensureAIUserExists, isAIUser } from '../utils/aiUser.js';\nimport { JobStatus } from '@prisma/client';\nimport { updateAssignmentRecord } from '../services/assignment.js';\nimport { updateWorksheetRecord } from '../services/worksheet.js';\n\nexport const aiStreamRouter = Router();\n\n/**\n * Authenticate request from session token (header or cookie).\n */\nasync function authenticateRequest(req: Request) {\n const userHeader = req.headers['x-user'];\n const tokenFromUserHeader = typeof userHeader === 'string' ? userHeader : Array.isArray(userHeader) ? userHeader[0] : undefined;\n const authorizationHeader = req.headers.authorization;\n const tokenFromAuthorization =\n typeof authorizationHeader === 'string' && authorizationHeader.startsWith('Bearer ')\n ? authorizationHeader.slice(7)\n : null;\n const token = tokenFromUserHeader ?? tokenFromAuthorization ?? undefined;\n if (!token) return null;\n return findUserBySessionToken(token);\n}\n\n/**\n * POST /api/ai/chat/stream\n *\n * Streams an AI response for a conversation (Lab Chat or Newton Tutor).\n * Uses the Vercel AI SDK data stream protocol.\n */\naiStreamRouter.post('/chat/stream', async (req: Request, res: Response) => {\n const user = await authenticateRequest(req);\n if (!user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n\n const { conversationId } = req.body as { conversationId?: string };\n if (!conversationId) {\n return res.status(400).json({ error: 'conversationId is required' });\n }\n\n // Verify user has access to this conversation\n const membership = await prisma.conversationMember.findFirst({\n where: { conversationId, userId: user.id },\n });\n if (!membership) {\n return res.status(403).json({ error: 'Access denied' });\n }\n\n // Determine context: Lab Chat or Newton Chat\n const labChat = await prisma.labChat.findFirst({\n where: { conversationId },\n select: {\n id: true,\n classId: true,\n context: true,\n class: { select: { subject: true, name: true } },\n },\n });\n\n const newtonChat = !labChat ? await prisma.newtonChat.findFirst({\n where: { conversationId },\n select: {\n id: true,\n submission: {\n select: {\n id: true,\n assignment: {\n select: {\n title: true,\n instructions: true,\n aiPolicyLevel: true,\n class: { select: { id: true, subject: true, name: true } },\n },\n },\n },\n },\n },\n }) : null;\n\n if (!labChat && !newtonChat) {\n return res.status(404).json({ error: 'No AI chat context found for this conversation' });\n }\n\n const classId = labChat?.classId || newtonChat?.submission.assignment.class.id;\n if (!classId) {\n return res.status(400).json({ error: 'Unable to determine class context' });\n }\n\n // Build message history from DB\n const recentMessages = await prisma.message.findMany({\n where: { conversationId, status: { not: JobStatus.PENDING } },\n orderBy: { createdAt: 'asc' },\n take: 20,\n select: {\n content: true,\n senderId: true,\n status: true,\n },\n });\n\n const messages: ModelMessage[] = recentMessages\n .filter((m) => m.content && m.content.length > 0)\n .map((m) => ({\n role: isAIUser(m.senderId) ? 'assistant' as const : 'user' as const,\n content: m.content,\n }));\n\n // Build system prompt based on context type\n let systemPrompt: string;\n if (labChat) {\n systemPrompt = buildLabChatSystemPrompt(labChat);\n } else {\n systemPrompt = buildNewtonSystemPrompt(newtonChat!);\n }\n\n // Create pending AI message\n await ensureAIUserExists();\n const aiMessage = await prisma.message.create({\n data: {\n content: '',\n senderId: getAIUserId(),\n conversationId,\n status: JobStatus.PENDING,\n },\n });\n\n // Broadcast pending state\n await pusher.trigger(chatChannel(conversationId), 'new-message', {\n id: aiMessage.id,\n content: '',\n senderId: getAIUserId(),\n conversationId,\n status: JobStatus.PENDING,\n createdAt: aiMessage.createdAt,\n sender: {\n id: getAIUserId(),\n username: 'Newton_AI',\n profile: { displayName: 'Newton AI', profilePicture: null },\n },\n mentionedUserIds: [],\n meta: {},\n attachments: [],\n });\n\n // Cache stream content in Redis\n const redis = getRedis();\n const streamKey = `stream:${aiMessage.id}`;\n if (redis) {\n await redis.set(streamKey, '', 'EX', 600);\n }\n\n try {\n const tools = aiTools(classId);\n\n const result = streamText({\n model: openai('gpt-4o-mini'),\n system: systemPrompt,\n messages,\n tools,\n temperature: 0.7,\n maxOutputTokens: 4096,\n stopWhen: stepCountIs(5),\n onStepFinish: async ({ toolCalls }) => {\n // Broadcast tool call events so all clients can show inline indicators\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n await pusher.trigger(chatChannel(conversationId), 'message-tool-call', {\n messageId: aiMessage.id,\n toolName: tc.toolName,\n status: 'executing',\n }).catch((err: unknown) => {\n logger.error('Failed to broadcast tool call event', { err, messageId: aiMessage.id });\n });\n }\n }\n },\n onFinish: async ({ text }) => {\n // Persist completed message\n await prisma.message.update({\n where: { id: aiMessage.id },\n data: { content: text, status: JobStatus.COMPLETED },\n });\n\n // Broadcast final state\n await pusher.trigger(chatChannel(conversationId), 'message-updated', {\n id: aiMessage.id,\n content: text,\n senderId: getAIUserId(),\n conversationId,\n status: JobStatus.COMPLETED,\n sender: {\n id: getAIUserId(),\n username: 'Newton_AI',\n profile: { displayName: 'Newton AI', profilePicture: null },\n },\n mentionedUserIds: [],\n meta: {},\n attachments: [],\n });\n\n // Clean up Redis\n if (redis) {\n await redis.del(streamKey);\n }\n\n logger.info('AI stream completed', {\n messageId: aiMessage.id,\n conversationId,\n contentLength: text.length,\n });\n },\n });\n\n // Stream to the requesting client via SSE and broadcast chunks via Pusher\n // so other participants also see progressive updates.\n res.writeHead(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n\n let chunkBuffer = '';\n for await (const chunk of result.textStream) {\n // Write to HTTP response for the requesting client\n res.write(chunk);\n\n // Buffer chunks to avoid excessive Pusher calls (batch per ~100 chars)\n chunkBuffer += chunk;\n if (chunkBuffer.length >= 100) {\n await pusher.trigger(chatChannel(conversationId), 'message-stream-chunk', {\n messageId: aiMessage.id,\n chunk: chunkBuffer,\n }).catch(() => {});\n // Update Redis cache\n if (redis) {\n await redis.append(streamKey, chunkBuffer);\n }\n chunkBuffer = '';\n }\n }\n\n // Flush remaining buffer\n if (chunkBuffer.length > 0) {\n await pusher.trigger(chatChannel(conversationId), 'message-stream-chunk', {\n messageId: aiMessage.id,\n chunk: chunkBuffer,\n }).catch(() => {});\n if (redis) {\n await redis.append(streamKey, chunkBuffer);\n }\n }\n\n res.end();\n } catch (error) {\n logger.error('AI stream error', { error, conversationId, messageId: aiMessage.id });\n\n await prisma.message.update({\n where: { id: aiMessage.id },\n data: { status: JobStatus.FAILED },\n });\n\n if (redis) {\n await redis.del(streamKey);\n }\n\n if (!res.headersSent) {\n return res.status(500).json({ error: 'Stream failed' });\n }\n }\n});\n\n/**\n * POST /api/ai/modify/stream\n *\n * Streams AI modifications to an assignment or worksheet.\n * Uses ordered-key output format for progressive rendering.\n */\naiStreamRouter.post('/modify/stream', async (req: Request, res: Response) => {\n const user = await authenticateRequest(req);\n if (!user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n\n const { assignmentId, worksheetId, prompt, classId } = req.body as {\n assignmentId?: string;\n worksheetId?: string;\n prompt?: string;\n classId?: string;\n };\n\n if (!prompt || !classId) {\n return res.status(400).json({ error: 'prompt and classId are required' });\n }\n\n if (!assignmentId && !worksheetId) {\n return res.status(400).json({ error: 'Either assignmentId or worksheetId is required' });\n }\n\n // Verify teacher access to class\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: { some: { id: user.id } },\n },\n });\n if (!teacherInClass) {\n return res.status(403).json({ error: 'Teacher access required' });\n }\n\n // Build context from existing resource and snapshot pre-edit state for undo\n let resourceContext: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let preEditSnapshot: Record<string, any> | null = null;\n if (assignmentId) {\n const assignment = await prisma.assignment.findUnique({\n where: { id: assignmentId },\n include: {\n markScheme: { select: { structured: true } },\n gradingBoundary: { select: { structured: true } },\n section: { select: { name: true } },\n worksheets: { include: { questions: { orderBy: { order: 'asc' } } } },\n },\n });\n if (!assignment) {\n return res.status(404).json({ error: 'Assignment not found' });\n }\n resourceContext = buildAssignmentContext(assignment);\n preEditSnapshot = {\n title: assignment.title,\n instructions: assignment.instructions,\n dueDate: assignment.dueDate?.toISOString() ?? null,\n type: assignment.type,\n maxGrade: assignment.maxGrade,\n graded: assignment.graded,\n weight: assignment.weight,\n acceptFiles: assignment.acceptFiles,\n acceptExtendedResponse: assignment.acceptExtendedResponse,\n acceptWorksheet: assignment.acceptWorksheet,\n aiPolicyLevel: assignment.aiPolicyLevel,\n modifiedAt: assignment.modifiedAt?.toISOString() ?? null,\n };\n } else {\n const worksheet = await prisma.worksheet.findUnique({\n where: { id: worksheetId! },\n include: { questions: { orderBy: { order: 'asc' } } },\n });\n if (!worksheet) {\n return res.status(404).json({ error: 'Worksheet not found' });\n }\n resourceContext = buildWorksheetContext(worksheet);\n preEditSnapshot = {\n name: worksheet.name,\n };\n }\n\n const systemPrompt = buildModifierSystemPrompt(assignmentId ? 'assignment' : 'worksheet');\n\n const messages: ModelMessage[] = [\n {\n role: 'user',\n content: `Here is the current ${assignmentId ? 'assignment' : 'worksheet'}:\\n\\n${resourceContext}\\n\\nTeacher's request: ${prompt}`,\n },\n ];\n\n const resourceId = assignmentId || worksheetId!;\n const resourceType = assignmentId ? 'assignment' : 'worksheet';\n const redis = getRedis();\n const modifyingKey = `aiModifying:${resourceId}`;\n const channel = teacherChannel(classId);\n\n // Set Redis flag so other users know a modification is in progress\n if (redis) {\n await redis.set(modifyingKey, JSON.stringify({\n userId: user.id,\n username: user.username,\n resourceType,\n resourceId,\n startedAt: Date.now(),\n }), 'EX', 300); // 5 min TTL safety net\n\n // Store pre-edit snapshot for undo (30 min TTL)\n if (preEditSnapshot) {\n const snapshotKey = `aiModifierSnapshot:${resourceId}`;\n await redis.set(snapshotKey, JSON.stringify({\n resourceType,\n resourceId,\n classId,\n userId: user.id,\n snapshot: preEditSnapshot,\n createdAt: Date.now(),\n }), 'EX', 1800);\n }\n }\n\n // Broadcast modifier-started to all teachers in the class\n await pusher.trigger(channel, 'modifier-started', {\n resourceId,\n resourceType,\n userId: user.id,\n username: user.username,\n }).catch((err: unknown) => {\n logger.error('Failed to broadcast modifier-started', { err, resourceId });\n });\n\n // Stream to requesting client via SSE; field changes are persisted by the\n // tools and broadcast to all open editors so they update live + stay locked.\n res.writeHead(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n });\n\n // Called after a tool persists a single field — apply it live everywhere.\n const onFieldUpdate = async (update: ModifierFieldUpdate) => {\n await pusher.trigger(channel, 'modifier-field-updated', {\n resourceId,\n resourceType,\n field: update.field,\n value: update.value,\n label: update.label,\n }).catch((err: unknown) => {\n logger.warn('Failed to broadcast modifier-field-updated', { err, resourceId });\n });\n // Human-readable progress for the requesting client's bar.\n res.write(`Updated ${update.label}.\\n`);\n };\n\n try {\n const tools = {\n ...aiTools(classId),\n ...(assignmentId\n ? assignmentModifierTools(user.id, assignmentId, classId, onFieldUpdate)\n : worksheetModifierTools(worksheetId!, user.id, onFieldUpdate)),\n };\n\n const result = streamText({\n model: openai('gpt-4o-mini'),\n system: systemPrompt,\n messages,\n tools,\n temperature: 0.3,\n maxOutputTokens: 8192,\n stopWhen: stepCountIs(8),\n });\n\n // Drain the stream. Field writes happen inside the tools' execute (which\n // call onFieldUpdate); any narration text is forwarded to the SSE client.\n for await (const chunk of result.textStream) {\n res.write(chunk);\n }\n\n // Clean up Redis flag and broadcast completion\n if (redis) {\n await redis.del(modifyingKey);\n }\n await pusher.trigger(channel, 'modifier-complete', {\n resourceId,\n resourceType,\n canUndo: Boolean(redis && preEditSnapshot),\n }).catch(() => {});\n\n res.end();\n } catch (error) {\n logger.error('AI modify stream error', { error, assignmentId, worksheetId });\n\n // Clean up Redis flag and broadcast failure\n if (redis) {\n await redis.del(modifyingKey);\n }\n await pusher.trigger(channel, 'modifier-failed', {\n resourceId,\n resourceType,\n }).catch(() => {});\n\n if (!res.headersSent) {\n return res.status(500).json({ error: 'Stream failed' });\n }\n }\n});\n\n/**\n * GET /api/ai/modify/status?resourceId=xxx\n *\n * Returns whether an AI modification is currently in progress for a resource.\n */\naiStreamRouter.get('/modify/status', async (req: Request, res: Response) => {\n const user = await authenticateRequest(req);\n if (!user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n\n const { resourceId } = req.query as { resourceId?: string };\n if (!resourceId) {\n return res.status(400).json({ error: 'resourceId is required' });\n }\n\n const redis = getRedis();\n if (!redis) {\n return res.json({ isModifying: false });\n }\n\n const data = await redis.get(`aiModifying:${resourceId}`);\n if (!data) {\n return res.json({ isModifying: false });\n }\n\n try {\n const parsed = JSON.parse(data);\n return res.json({\n isModifying: true,\n userId: parsed.userId,\n username: parsed.username,\n resourceType: parsed.resourceType,\n startedAt: parsed.startedAt,\n });\n } catch {\n return res.json({ isModifying: false });\n }\n});\n\n/**\n * POST /api/ai/modify/undo\n *\n * Reverts the most recent AI modifier run for a resource by restoring the\n * pre-edit snapshot stored in Redis.\n */\naiStreamRouter.post('/modify/undo', async (req: Request, res: Response) => {\n const user = await authenticateRequest(req);\n if (!user) {\n return res.status(401).json({ error: 'Authentication required' });\n }\n\n const { resourceId, classId } = req.body as { resourceId?: string; classId?: string };\n if (!resourceId || !classId) {\n return res.status(400).json({ error: 'resourceId and classId are required' });\n }\n\n // Verify teacher access to class\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: classId,\n teachers: { some: { id: user.id } },\n },\n });\n if (!teacherInClass) {\n return res.status(403).json({ error: 'Teacher access required' });\n }\n\n const redis = getRedis();\n if (!redis) {\n return res.status(400).json({ error: 'Undo not available' });\n }\n\n const snapshotKey = `aiModifierSnapshot:${resourceId}`;\n const raw = await redis.get(snapshotKey);\n if (!raw) {\n return res.status(404).json({ error: 'No undo snapshot available (may have expired)' });\n }\n\n let parsed: {\n resourceType: 'assignment' | 'worksheet';\n resourceId: string;\n classId: string;\n userId: string;\n snapshot: Record<string, unknown>;\n createdAt: number;\n };\n try {\n parsed = JSON.parse(raw);\n } catch {\n return res.status(500).json({ error: 'Corrupt snapshot data' });\n }\n\n try {\n if (parsed.resourceType === 'assignment') {\n const { modifiedAt: _modifiedAt, ...fields } = parsed.snapshot;\n await updateAssignmentRecord(user.id, {\n id: resourceId,\n classId,\n ...fields,\n });\n } else {\n await updateWorksheetRecord(resourceId, user.id, parsed.snapshot);\n }\n\n // Remove the snapshot so undo can only be used once\n await redis.del(snapshotKey);\n\n // Broadcast undo to all teachers so they refresh\n const channel = teacherChannel(classId);\n await pusher.trigger(channel, 'modifier-undone', {\n resourceId,\n resourceType: parsed.resourceType,\n }).catch((err: unknown) => {\n logger.warn('Failed to broadcast modifier-undone', { err, resourceId });\n });\n\n return res.json({ success: true });\n } catch (error) {\n logger.error('AI modifier undo failed', { error, resourceId });\n return res.status(500).json({ error: 'Failed to undo changes' });\n }\n});\n\n// --- Helper functions ---\n\nfunction buildLabChatSystemPrompt(labChat: {\n context: string | null;\n class: { subject: string; name: string } | null;\n}): string {\n return `You are Newton AI, an intelligent teaching assistant for the class \"${labChat.class?.name}\" (subject: ${labChat.class?.subject}).\n\nYou help teachers create course materials, plan lessons, and manage their class. You have access to tools that let you search through class materials, assignments, and student data.\n\n${labChat.context ? `Context: ${labChat.context}` : ''}\n\nIMPORTANT RULES:\n- Use plain text responses (no markdown formatting)\n- Be conversational and helpful\n- When you need information about class materials or assignments, use the search_materials or search_assignments tools\n- Only ask clarifying questions about content/pedagogy, never about technical details\n- Make reasonable defaults for colors, formats, and technical choices\n- Keep responses concise (2-4 sentences for chat, longer for content creation)`;\n}\n\nfunction buildNewtonSystemPrompt(newtonChat: {\n submission: {\n assignment: {\n title: string;\n instructions: string | null;\n aiPolicyLevel: number | null;\n class: { subject: string | null; name: string };\n };\n };\n}): string {\n const { assignment } = newtonChat.submission;\n const policyLevel = assignment.aiPolicyLevel || 2;\n\n return `You are Newton, an AI tutor helping a student with their assignment.\n\nAssignment: ${assignment.title}\nSubject: ${assignment.class.subject}\nClass: ${assignment.class.name}\nInstructions: ${assignment.instructions || 'No specific instructions provided'}\nAI Policy Level: ${policyLevel}/5\n\nYour role:\n- Help the student understand concepts related to their assignment\n- Guide them through problems without giving direct answers\n- Use the search_materials tool to find relevant class materials when helpful\n- Encourage critical thinking and self-discovery\n- Be supportive, clear, and educational\n- Use plain text only (no markdown)\n\nAI Policy Level ${policyLevel} means:\n${policyLevel <= 2 ? '- Very limited AI assistance. Do NOT provide direct answers or solutions. Only clarify concepts and ask guiding questions.' : ''}\n${policyLevel === 3 ? '- Moderate AI assistance. You can explain concepts and give examples, but avoid solving the exact assignment problems.' : ''}\n${policyLevel >= 4 ? '- Extended AI assistance allowed. You can provide detailed explanations, examples, and guided solutions.' : ''}\n\nNEVER provide complete answers regardless of policy level. Always guide learning.`;\n}\n\nfunction buildModifierSystemPrompt(resourceType: 'assignment' | 'worksheet'): string {\n if (resourceType === 'assignment') {\n return `You are an AI assistant that edits an existing assignment based on teacher instructions.\n\nHOW TO EDIT: You change the assignment by CALLING TOOLS — never by printing the new value as text.\n- Call \\`update_assignment_field\\` once for every individual field the teacher wants changed.\n Editable fields: title, instructions, dueDate, type, maxGrade, graded, weight,\n acceptFiles, acceptExtendedResponse, acceptWorksheet, aiPolicyLevel.\n- Pass the value as a string: booleans as \"true\"/\"false\", numbers as digits,\n dueDate as an ISO 8601 datetime, and type as one of\n HOMEWORK|QUIZ|TEST|PROJECT|ESSAY|DISCUSSION|PRESENTATION|LAB|OTHER.\n- Use \\`search_materials\\` first only if you need class context.\n\nRULES:\n- Only change the fields the teacher actually asked about. Do not touch anything else.\n- Each tool call saves immediately and is shown to the teacher live.\n- After making all the changes, write a brief conversational summary of what you did.\n Be human and specific — mention the actual values. For example:\n \"Alright, I've changed the title to 'Chapter 5 Review' and pushed the due date to next Friday.\"\n Do NOT dump the full assignment contents — just summarize the changes naturally.`;\n }\n\n return `You are an AI assistant that edits an existing worksheet based on teacher instructions.\n\nHOW TO EDIT: You change the worksheet by CALLING TOOLS — never by printing the new value as text.\n- Call \\`update_worksheet_field\\` for the field the teacher wants changed (currently: name).\n- Use \\`search_materials\\` first only if you need class context.\n\nRULES:\n- Only change what the teacher asked about.\n- Each tool call saves immediately and is shown to the teacher live.\n- After making all the changes, write a brief conversational summary of what you did.\n Be human and specific — mention the actual values. For example:\n \"Done — I've renamed the worksheet to 'Unit 3 Practice Problems'.\"\n Do NOT dump the full worksheet contents — just summarize naturally.`;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildAssignmentContext(assignment: any): string {\n let context = `TITLE: ${assignment.title}\nINSTRUCTIONS: ${assignment.instructions || '(none)'}\nDUE_DATE: ${assignment.dueDate.toISOString()}\nTYPE: ${assignment.type}\nMAX_GRADE: ${assignment.maxGrade ?? 100}\nSECTION: ${assignment.section?.name || 'NONE'}\nACCEPT_FILES: ${assignment.acceptFiles}\nACCEPT_EXTENDED_RESPONSE: ${assignment.acceptExtendedResponse}\nACCEPT_WORKSHEET: ${assignment.acceptWorksheet}`;\n\n if (assignment.markScheme) {\n try {\n const ms = JSON.parse(assignment.markScheme.structured);\n context += '\\nMARK_SCHEME_START';\n if (Array.isArray(ms.criteria)) {\n for (const c of ms.criteria) {\n context += `\\nMS_CRITERION: ${c.description} | POINTS: ${c.points}`;\n }\n }\n context += '\\nMARK_SCHEME_END';\n } catch { /* ignore malformed JSON */ }\n }\n\n if (assignment.worksheets && assignment.worksheets.length > 0) {\n context += '\\nQUESTIONS_START';\n for (const ws of assignment.worksheets) {\n for (const q of ws.questions) {\n context += `\\nQ_TYPE: ${q.type}`;\n context += `\\nQ_TEXT: ${q.question}`;\n context += `\\nQ_ANSWER: ${q.answer}`;\n if (q.options && typeof q.options === 'object') {\n const opts = Array.isArray(q.options) ? q.options : (q.options as Record<string, unknown>).options;\n if (Array.isArray(opts)) {\n context += `\\nQ_OPTIONS: ${opts.map((o: { text?: string } | string) => typeof o === 'string' ? o : o.text || '').join('|')}`;\n }\n }\n context += `\\nQ_POINTS: ${q.points}`;\n context += '\\n---';\n }\n }\n context += '\\nQUESTIONS_END';\n }\n\n return context;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildWorksheetContext(worksheet: any): string {\n let context = `WORKSHEET_NAME: ${worksheet.name}\\nQUESTIONS_START`;\n\n for (const q of worksheet.questions) {\n context += `\\nQ_TYPE: ${q.type}`;\n context += `\\nQ_TEXT: ${q.question}`;\n context += `\\nQ_ANSWER: ${q.answer}`;\n if (q.options && typeof q.options === 'object') {\n const opts = Array.isArray(q.options) ? q.options : (q.options as Record<string, unknown>).options;\n if (Array.isArray(opts)) {\n context += `\\nQ_OPTIONS: ${opts.map((o: { text?: string } | string) => typeof o === 'string' ? o : o.text || '').join('|')}`;\n }\n }\n context += `\\nQ_POINTS: ${q.points}`;\n context += '\\n---';\n }\n\n context += '\\nQUESTIONS_END';\n return context;\n}\n"],"names":[],"mappings":"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","debug_id":"de32fb67-392b-5976-8b7c-1098752de11a"}
@@ -12,9 +12,9 @@ export declare function addNotification(userId: string, title: string, content:
12
12
  createdAt: Date;
13
13
  title: string;
14
14
  content: string;
15
- senderId: string | null;
16
- receiverId: string;
17
15
  read: boolean;
16
+ receiverId: string;
17
+ senderId: string | null;
18
18
  }>;
19
19
  export declare const seedDatabase: () => Promise<void>;
20
20
  //# sourceMappingURL=seedDatabase.d.ts.map
@@ -1,5 +1,5 @@
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]="a764ff67-df4a-5c42-b133-d6b43f06c40e")}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]="b02c881f-1479-5633-b1f5-eee42d260607")}catch(e){}}();
3
3
  import { prisma } from "./lib/prisma.js";
4
4
  import { hash } from "bcryptjs";
5
5
  import { logger } from "./utils/logger.js";
@@ -24,7 +24,7 @@ export async function clearDatabase() {
24
24
  // Discussion tree.
25
25
  await prisma.discussionReply.deleteMany();
26
26
  await prisma.discussion.deleteMany();
27
- await prisma.discussionTag.deleteMany();
27
+ await prisma.classTag.deleteMany();
28
28
  // Comments after their reactions are gone.
29
29
  await prisma.comment.deleteMany();
30
30
  // Newton + Lab chats sit on conversations + submissions.
@@ -1238,13 +1238,13 @@ export const seedDatabase = async () => {
1238
1238
  // ---------------------------------------------------------------------
1239
1239
  // 15. Discussions (with replies, tags, reads, reactions)
1240
1240
  // ---------------------------------------------------------------------
1241
- const bioTag = await prisma.discussionTag.create({
1241
+ const bioTag = await prisma.classTag.create({
1242
1242
  data: { classId: biologyClass.id, name: "Lab", color: "#10B981" },
1243
1243
  });
1244
- const bioTagHomework = await prisma.discussionTag.create({
1244
+ const bioTagHomework = await prisma.classTag.create({
1245
1245
  data: { classId: biologyClass.id, name: "Homework Help", color: "#F59E0B" },
1246
1246
  });
1247
- const mathTagAP = await prisma.discussionTag.create({
1247
+ const mathTagAP = await prisma.classTag.create({
1248
1248
  data: { classId: mathClass.id, name: "AP Prep", color: "#DC2626" },
1249
1249
  });
1250
1250
  const labQuestion = await prisma.discussion.create({
@@ -1712,4 +1712,4 @@ if (isSeedScript) {
1712
1712
  })();
1713
1713
  }
1714
1714
  //# sourceMappingURL=seedDatabase.js.map
1715
- //# debugId=a764ff67-df4a-5c42-b133-d6b43f06c40e
1715
+ //# debugId=b02c881f-1479-5633-b1f5-eee42d260607