@studious-lms/server 1.14.0 → 1.16.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 (129) hide show
  1. package/dist/lib/inferDocumentFormat.d.ts +10 -0
  2. package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
  3. package/dist/lib/inferDocumentFormat.js +48 -0
  4. package/dist/lib/inferDocumentFormat.js.map +1 -0
  5. package/dist/models/announcement.d.ts +45 -45
  6. package/dist/models/assignment.d.ts +75 -75
  7. package/dist/models/class.d.ts +13 -13
  8. package/dist/models/comment.d.ts +6 -6
  9. package/dist/models/conversation.d.ts +23 -23
  10. package/dist/models/event.d.ts +18 -18
  11. package/dist/models/file.d.ts +9 -9
  12. package/dist/models/labChat.d.ts +4 -4
  13. package/dist/models/message.d.ts +13 -13
  14. package/dist/models/newtonChat.d.ts +3 -3
  15. package/dist/models/notification.d.ts +4 -4
  16. package/dist/models/worksheet.d.ts +121 -121
  17. package/dist/pipelines/aiLabChat.d.ts +7 -1
  18. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  19. package/dist/pipelines/aiLabChat.js +145 -67
  20. package/dist/pipelines/aiLabChat.js.map +1 -1
  21. package/dist/pipelines/aiLabChatContract.d.ts +34 -195
  22. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  23. package/dist/pipelines/aiLabChatContract.js +9 -19
  24. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  25. package/dist/pipelines/gradeWorksheet.d.ts +6 -6
  26. package/dist/pipelines/gradeWorksheet.d.ts.map +1 -1
  27. package/dist/pipelines/gradeWorksheet.js +75 -36
  28. package/dist/pipelines/gradeWorksheet.js.map +1 -1
  29. package/dist/pipelines/labChatPrompt.d.ts +8 -3
  30. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  31. package/dist/pipelines/labChatPrompt.js +49 -14
  32. package/dist/pipelines/labChatPrompt.js.map +1 -1
  33. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  34. package/dist/routers/_app.d.ts +524 -516
  35. package/dist/routers/_app.d.ts.map +1 -1
  36. package/dist/routers/announcement.d.ts +40 -40
  37. package/dist/routers/assignment.d.ts +121 -121
  38. package/dist/routers/class.d.ts +8 -8
  39. package/dist/routers/comment.d.ts +5 -5
  40. package/dist/routers/conversation.d.ts +6 -6
  41. package/dist/routers/discussion.d.ts +3 -3
  42. package/dist/routers/embedding.d.ts +6 -2
  43. package/dist/routers/embedding.d.ts.map +1 -1
  44. package/dist/routers/embedding.js +44 -36
  45. package/dist/routers/embedding.js.map +1 -1
  46. package/dist/routers/event.d.ts +18 -18
  47. package/dist/routers/file.d.ts +2 -2
  48. package/dist/routers/labChat.d.ts +3 -3
  49. package/dist/routers/notifications.d.ts +4 -4
  50. package/dist/routers/search.d.ts +2 -2
  51. package/dist/routers/worksheet.d.ts +44 -44
  52. package/dist/routes/aiStream.d.ts.map +1 -1
  53. package/dist/routes/aiStream.js +41 -11
  54. package/dist/routes/aiStream.js.map +1 -1
  55. package/dist/seedDatabase.d.ts +1 -1
  56. package/dist/services/aiChatStream.d.ts +18 -0
  57. package/dist/services/aiChatStream.d.ts.map +1 -1
  58. package/dist/services/aiChatStream.js +81 -11
  59. package/dist/services/aiChatStream.js.map +1 -1
  60. package/dist/services/aiModifierTools.d.ts +0 -16
  61. package/dist/services/aiModifierTools.d.ts.map +1 -1
  62. package/dist/services/aiModifierTools.js +112 -3
  63. package/dist/services/aiModifierTools.js.map +1 -1
  64. package/dist/services/aiProposalTools.d.ts.map +1 -1
  65. package/dist/services/aiProposalTools.js +25 -25
  66. package/dist/services/aiProposalTools.js.map +1 -1
  67. package/dist/services/announcement.d.ts +34 -34
  68. package/dist/services/assignment.d.ts +111 -111
  69. package/dist/services/assignment.d.ts.map +1 -1
  70. package/dist/services/assignment.js +4 -2
  71. package/dist/services/assignment.js.map +1 -1
  72. package/dist/services/class.d.ts +6 -6
  73. package/dist/services/class.d.ts.map +1 -1
  74. package/dist/services/class.js +7 -3
  75. package/dist/services/class.js.map +1 -1
  76. package/dist/services/comment.d.ts +5 -5
  77. package/dist/services/conversation.d.ts +6 -6
  78. package/dist/services/discussion.d.ts.map +1 -1
  79. package/dist/services/discussion.js +9 -2
  80. package/dist/services/discussion.js.map +1 -1
  81. package/dist/services/embedding.d.ts +19 -1
  82. package/dist/services/embedding.d.ts.map +1 -1
  83. package/dist/services/embedding.js +154 -8
  84. package/dist/services/embedding.js.map +1 -1
  85. package/dist/services/event.d.ts +18 -18
  86. package/dist/services/file.d.ts +4 -4
  87. package/dist/services/folder.d.ts.map +1 -1
  88. package/dist/services/folder.js +32 -2
  89. package/dist/services/folder.js.map +1 -1
  90. package/dist/services/labChat.d.ts +3 -3
  91. package/dist/services/notification.d.ts +4 -4
  92. package/dist/services/openaiDocumentGen.d.ts +25 -0
  93. package/dist/services/openaiDocumentGen.d.ts.map +1 -0
  94. package/dist/services/openaiDocumentGen.js +195 -0
  95. package/dist/services/openaiDocumentGen.js.map +1 -0
  96. package/dist/services/search.d.ts +1 -1
  97. package/dist/services/search.d.ts.map +1 -1
  98. package/dist/services/search.js +27 -2
  99. package/dist/services/search.js.map +1 -1
  100. package/dist/services/worksheet.d.ts +66 -49
  101. package/dist/services/worksheet.d.ts.map +1 -1
  102. package/dist/services/worksheet.js +48 -3
  103. package/dist/services/worksheet.js.map +1 -1
  104. package/dist/workers/processors/embedContent.d.ts.map +1 -1
  105. package/dist/workers/processors/embedContent.js +16 -25
  106. package/dist/workers/processors/embedContent.js.map +1 -1
  107. package/package.json +1 -1
  108. package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
  109. package/prisma/schema.prisma +3 -0
  110. package/src/lib/inferDocumentFormat.ts +58 -0
  111. package/src/pipelines/aiLabChat.ts +185 -74
  112. package/src/pipelines/aiLabChatContract.ts +7 -17
  113. package/src/pipelines/gradeWorksheet.ts +95 -38
  114. package/src/pipelines/labChatPrompt.ts +61 -14
  115. package/src/routers/embedding.ts +44 -39
  116. package/src/routes/aiStream.ts +47 -9
  117. package/src/services/aiChatStream.ts +103 -8
  118. package/src/services/aiModifierTools.ts +154 -1
  119. package/src/services/aiProposalTools.ts +26 -25
  120. package/src/services/assignment.ts +3 -0
  121. package/src/services/class.ts +7 -1
  122. package/src/services/discussion.ts +13 -0
  123. package/src/services/embedding.ts +167 -6
  124. package/src/services/folder.ts +31 -0
  125. package/src/services/openaiDocumentGen.ts +237 -0
  126. package/src/services/search.ts +25 -1
  127. package/src/services/worksheet.ts +68 -1
  128. package/src/workers/processors/embedContent.ts +18 -22
  129. package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
@@ -359,7 +359,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
359
359
  input: {
360
360
  [x: string]: unknown;
361
361
  classId: string;
362
- type: "teacher" | "student";
362
+ type: "student" | "teacher";
363
363
  userId: string;
364
364
  };
365
365
  output: {
@@ -377,7 +377,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
377
377
  studentsCanReply: boolean;
378
378
  };
379
379
  user: {
380
- type: "teacher" | "student";
380
+ type: "student" | "teacher";
381
381
  id: string;
382
382
  username: string;
383
383
  };
@@ -479,8 +479,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
479
479
  id: string;
480
480
  createdAt: Date;
481
481
  assignmentId: string;
482
- modifiedAt: Date;
483
482
  studentId: string;
483
+ modifiedAt: Date;
484
484
  extendedResponse: string | null;
485
485
  gradeReceived: number | null;
486
486
  recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
@@ -515,8 +515,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
515
515
  id: string;
516
516
  createdAt: Date;
517
517
  assignmentId: string;
518
- modifiedAt: Date;
519
518
  studentId: string;
519
+ modifiedAt: Date;
520
520
  extendedResponse: string | null;
521
521
  gradeReceived: number | null;
522
522
  recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
@@ -744,7 +744,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
744
744
  input: {
745
745
  [x: string]: unknown;
746
746
  classId: string;
747
- type: "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "DISCUSSION" | "PRESENTATION" | "LAB" | "OTHER";
747
+ type: "DISCUSSION" | "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "PRESENTATION" | "LAB" | "OTHER";
748
748
  title: string;
749
749
  instructions: string;
750
750
  dueDate?: Date | undefined;
@@ -1017,11 +1017,11 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
1017
1017
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
1018
1018
  options: import("@prisma/client/runtime/library.js").JsonValue;
1019
1019
  markScheme: import("@prisma/client/runtime/library.js").JsonValue;
1020
- order: number | null;
1021
- worksheetId: string;
1020
+ points: number;
1022
1021
  question: string;
1022
+ worksheetId: string;
1023
+ order: number | null;
1023
1024
  answer: string;
1024
- points: number;
1025
1025
  }[];
1026
1026
  }[];
1027
1027
  markSchemes: {
@@ -39,8 +39,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
39
39
  content: string;
40
40
  assignmentId: string | null;
41
41
  submissionId: string | null;
42
- modifiedAt: Date | null;
43
42
  announcementId: string | null;
43
+ modifiedAt: Date | null;
44
44
  isPinned: boolean;
45
45
  author: {
46
46
  id: string;
@@ -75,8 +75,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
75
75
  content: string;
76
76
  assignmentId: string | null;
77
77
  submissionId: string | null;
78
- modifiedAt: Date | null;
79
78
  announcementId: string | null;
79
+ modifiedAt: Date | null;
80
80
  authorId: string;
81
81
  isPinned: boolean;
82
82
  parentCommentId: string | null;
@@ -95,8 +95,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
95
95
  content: string;
96
96
  assignmentId: string | null;
97
97
  submissionId: string | null;
98
- modifiedAt: Date | null;
99
98
  announcementId: string | null;
99
+ modifiedAt: Date | null;
100
100
  authorId: string;
101
101
  isPinned: boolean;
102
102
  parentCommentId: string | null;
@@ -115,8 +115,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
115
115
  content: string;
116
116
  assignmentId: string | null;
117
117
  submissionId: string | null;
118
- modifiedAt: Date | null;
119
118
  announcementId: string | null;
119
+ modifiedAt: Date | null;
120
120
  authorId: string;
121
121
  isPinned: boolean;
122
122
  parentCommentId: string | null;
@@ -144,8 +144,8 @@ export declare const commentRouter: import("@trpc/server").TRPCBuiltRouter<{
144
144
  content: string;
145
145
  assignmentId: string | null;
146
146
  submissionId: string | null;
147
- modifiedAt: Date | null;
148
147
  announcementId: string | null;
148
+ modifiedAt: Date | null;
149
149
  authorId: string;
150
150
  isPinned: boolean;
151
151
  parentCommentId: string | null;
@@ -40,8 +40,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
40
40
  } & {
41
41
  id: string;
42
42
  userId: string;
43
- conversationId: string;
44
43
  role: import(".prisma/client").$Enums.ConversationRole;
44
+ conversationId: string;
45
45
  joinedAt: Date;
46
46
  hiddenAt: Date | null;
47
47
  lastViewedAt: Date | null;
@@ -61,9 +61,9 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
61
61
  id: string;
62
62
  createdAt: Date;
63
63
  content: string;
64
+ senderId: string;
64
65
  conversationId: string;
65
66
  runJobId: string | null;
66
- senderId: string;
67
67
  };
68
68
  unreadCount: number;
69
69
  unreadMentionCount: number;
@@ -104,8 +104,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
104
104
  } & {
105
105
  id: string;
106
106
  userId: string;
107
- conversationId: string;
108
107
  role: import(".prisma/client").$Enums.ConversationRole;
108
+ conversationId: string;
109
109
  joinedAt: Date;
110
110
  hiddenAt: Date | null;
111
111
  lastViewedAt: Date | null;
@@ -138,8 +138,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
138
138
  } & {
139
139
  id: string;
140
140
  userId: string;
141
- conversationId: string;
142
141
  role: import(".prisma/client").$Enums.ConversationRole;
142
+ conversationId: string;
143
143
  joinedAt: Date;
144
144
  hiddenAt: Date | null;
145
145
  lastViewedAt: Date | null;
@@ -182,8 +182,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
182
182
  } & {
183
183
  id: string;
184
184
  userId: string;
185
- conversationId: string;
186
185
  role: import(".prisma/client").$Enums.ConversationRole;
186
+ conversationId: string;
187
187
  joinedAt: Date;
188
188
  hiddenAt: Date | null;
189
189
  lastViewedAt: Date | null;
@@ -217,8 +217,8 @@ export declare const conversationRouter: import("@trpc/server").TRPCBuiltRouter<
217
217
  } & {
218
218
  id: string;
219
219
  userId: string;
220
- conversationId: string;
221
220
  role: import(".prisma/client").$Enums.ConversationRole;
221
+ conversationId: string;
222
222
  joinedAt: Date;
223
223
  hiddenAt: Date | null;
224
224
  lastViewedAt: Date | null;
@@ -19,7 +19,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
19
19
  list: import("@trpc/server").TRPCQueryProcedure<{
20
20
  input: {
21
21
  classId: string;
22
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
22
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
23
23
  sort?: "recent" | "activity" | "top" | undefined;
24
24
  cursor?: string | undefined;
25
25
  search?: string | undefined;
@@ -165,7 +165,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
165
165
  classId: string;
166
166
  title: string;
167
167
  body: string;
168
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
168
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
169
169
  tagIds?: string[] | undefined;
170
170
  attachmentIds?: string[] | undefined;
171
171
  };
@@ -258,7 +258,7 @@ export declare const discussionRouter: import("@trpc/server").TRPCBuiltRouter<{
258
258
  update: import("@trpc/server").TRPCMutationProcedure<{
259
259
  input: {
260
260
  discussionId: string;
261
- type?: "DISCUSSION" | "QUESTION" | "ANNOUNCEMENT" | undefined;
261
+ type?: "ANNOUNCEMENT" | "DISCUSSION" | "QUESTION" | undefined;
262
262
  title?: string | undefined;
263
263
  body?: string | undefined;
264
264
  allowReplies?: boolean | undefined;
@@ -28,7 +28,7 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
28
28
  query: string;
29
29
  classId: string;
30
30
  limit?: number | undefined;
31
- sourceTypes?: ("ANNOUNCEMENT" | "FILE" | "ASSIGNMENT" | "WORKSHEET" | "SECTION")[] | undefined;
31
+ sourceTypes?: ("FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS")[] | undefined;
32
32
  };
33
33
  output: import("../services/embedding.js").EmbeddingSearchResult[];
34
34
  meta: object;
@@ -40,7 +40,7 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
40
40
  reindex: import("@trpc/server").TRPCMutationProcedure<{
41
41
  input: {
42
42
  classId: string;
43
- sourceType: "ANNOUNCEMENT" | "FILE" | "ASSIGNMENT" | "WORKSHEET" | "SECTION";
43
+ sourceType: "FILE" | "ASSIGNMENT" | "WORKSHEET" | "ANNOUNCEMENT" | "SECTION" | "DISCUSSION" | "SUBMISSION" | "SYLLABUS";
44
44
  sourceId: string;
45
45
  };
46
46
  output: {
@@ -61,6 +61,10 @@ export declare const embeddingRouter: import("@trpc/server").TRPCBuiltRouter<{
61
61
  assignments: number;
62
62
  worksheets: number;
63
63
  announcements: number;
64
+ discussions: number;
65
+ submissions: number;
66
+ syllabus: number;
67
+ files: number;
64
68
  };
65
69
  };
66
70
  meta: object;
@@ -1 +1 @@
1
- {"version":3,"file":"embedding.d.ts","sourceRoot":"/","sources":["routers/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;IAC1B;;OAEG;;;;;;;;;;;IAkCH;;;OAGG;;;;;;;;;;;;IAgCH;;;OAGG;;;;;;;;;;;;;;GAuEH,CAAC"}
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"/","sources":["routers/embedding.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAaxB,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;IAC1B;;OAEG;;;;;;;;;;;IAiCH;;;OAGG;;;;;;;;;;;;IA+BH;;;OAGG;;;;;;;;;;;;;;;;;;GAyEH,CAAC"}
@@ -3,13 +3,17 @@
3
3
  * Provides search and indexing triggers for class content.
4
4
  */
5
5
 
6
- !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]="2a73cd21-6669-5303-82a8-94d941a432bd")}catch(e){}}();
6
+ !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]="6aa753e1-b0da-52b8-9e5c-afa887df290b")}catch(e){}}();
7
7
  import { z } from 'zod';
8
8
  import { createTRPCRouter, protectedProcedure } from '../trpc.js';
9
9
  import { searchEmbeddings } from '../services/embedding.js';
10
10
  import { enqueueRunJob } from '../workers/queues.js';
11
11
  import { prisma } from '../lib/prisma.js';
12
12
  import { TRPCError } from '@trpc/server';
13
+ const sourceTypeEnum = z.enum([
14
+ 'FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT',
15
+ 'SECTION', 'DISCUSSION', 'SUBMISSION', 'SYLLABUS',
16
+ ]);
13
17
  export const embeddingRouter = createTRPCRouter({
14
18
  /**
15
19
  * Semantic search over class materials.
@@ -19,10 +23,9 @@ export const embeddingRouter = createTRPCRouter({
19
23
  classId: z.string(),
20
24
  query: z.string().min(1).max(500),
21
25
  limit: z.number().min(1).max(20).default(5),
22
- sourceTypes: z.array(z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION'])).optional(),
26
+ sourceTypes: z.array(sourceTypeEnum).optional(),
23
27
  }))
24
28
  .query(async ({ input, ctx }) => {
25
- // Verify user has access to the class
26
29
  const userInClass = await prisma.class.findFirst({
27
30
  where: {
28
31
  id: input.classId,
@@ -50,11 +53,10 @@ export const embeddingRouter = createTRPCRouter({
50
53
  reindex: protectedProcedure
51
54
  .input(z.object({
52
55
  classId: z.string(),
53
- sourceType: z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION']),
56
+ sourceType: sourceTypeEnum,
54
57
  sourceId: z.string(),
55
58
  }))
56
59
  .mutation(async ({ input, ctx }) => {
57
- // Verify teacher access
58
60
  const teacherInClass = await prisma.class.findFirst({
59
61
  where: {
60
62
  id: input.classId,
@@ -92,42 +94,44 @@ export const embeddingRouter = createTRPCRouter({
92
94
  if (!teacherInClass) {
93
95
  throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });
94
96
  }
95
- // Enqueue all assignments
96
- const assignments = await prisma.assignment.findMany({
97
- where: { classId: input.classId },
98
- select: { id: true },
99
- });
100
- // Enqueue all worksheets
101
- const worksheets = await prisma.worksheet.findMany({
102
- where: { classId: input.classId },
103
- select: { id: true },
104
- });
105
- // Enqueue all announcements
106
- const announcements = await prisma.announcement.findMany({
107
- where: { classId: input.classId },
108
- select: { id: true },
109
- });
97
+ const [assignments, worksheets, announcements, discussions, submissions, classData, classFiles] = await Promise.all([
98
+ prisma.assignment.findMany({ where: { classId: input.classId }, select: { id: true } }),
99
+ prisma.worksheet.findMany({ where: { classId: input.classId }, select: { id: true } }),
100
+ prisma.announcement.findMany({ where: { classId: input.classId }, select: { id: true } }),
101
+ prisma.discussion.findMany({ where: { classId: input.classId }, select: { id: true } }),
102
+ prisma.submission.findMany({
103
+ where: { assignment: { classId: input.classId }, gradeReceived: { not: null } },
104
+ select: { id: true },
105
+ }),
106
+ prisma.class.findUnique({ where: { id: input.classId }, select: { syllabus: true } }),
107
+ prisma.folder.findUnique({
108
+ where: { classId: input.classId },
109
+ select: { files: { select: { id: true }, where: { uploadStatus: 'COMPLETED' } } },
110
+ }),
111
+ ]);
110
112
  const jobs = [];
113
+ const opts = { classId: input.classId, userId: ctx.user.id };
111
114
  for (const a of assignments) {
112
- jobs.push(enqueueRunJob('EMBED_CONTENT', {
113
- classId: input.classId,
114
- sourceType: 'ASSIGNMENT',
115
- sourceId: a.id,
116
- }, { classId: input.classId, userId: ctx.user.id }));
115
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ASSIGNMENT', sourceId: a.id }, opts));
117
116
  }
118
117
  for (const w of worksheets) {
119
- jobs.push(enqueueRunJob('EMBED_CONTENT', {
120
- classId: input.classId,
121
- sourceType: 'WORKSHEET',
122
- sourceId: w.id,
123
- }, { classId: input.classId, userId: ctx.user.id }));
118
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'WORKSHEET', sourceId: w.id }, opts));
124
119
  }
125
120
  for (const ann of announcements) {
126
- jobs.push(enqueueRunJob('EMBED_CONTENT', {
127
- classId: input.classId,
128
- sourceType: 'ANNOUNCEMENT',
129
- sourceId: ann.id,
130
- }, { classId: input.classId, userId: ctx.user.id }));
121
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ANNOUNCEMENT', sourceId: ann.id }, opts));
122
+ }
123
+ for (const d of discussions) {
124
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'DISCUSSION', sourceId: d.id }, opts));
125
+ }
126
+ for (const s of submissions) {
127
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SUBMISSION', sourceId: s.id }, opts));
128
+ }
129
+ if (classData?.syllabus) {
130
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SYLLABUS', sourceId: input.classId }, opts));
131
+ }
132
+ const files = classFiles?.files ?? [];
133
+ for (const f of files) {
134
+ jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'FILE', sourceId: f.id }, opts));
131
135
  }
132
136
  await Promise.allSettled(jobs);
133
137
  return {
@@ -135,9 +139,13 @@ export const embeddingRouter = createTRPCRouter({
135
139
  assignments: assignments.length,
136
140
  worksheets: worksheets.length,
137
141
  announcements: announcements.length,
142
+ discussions: discussions.length,
143
+ submissions: submissions.length,
144
+ syllabus: classData?.syllabus ? 1 : 0,
145
+ files: files.length,
138
146
  },
139
147
  };
140
148
  }),
141
149
  });
142
150
  //# sourceMappingURL=embedding.js.map
143
- //# debugId=2a73cd21-6669-5303-82a8-94d941a432bd
151
+ //# debugId=6aa753e1-b0da-52b8-9e5c-afa887df290b
@@ -1 +1 @@
1
- {"version":3,"file":"embedding.js","sources":["routers/embedding.ts"],"sourceRoot":"/","sourcesContent":["/**\n * tRPC router for embedding/RAG operations.\n * Provides search and indexing triggers for class content.\n */\nimport { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { searchEmbeddings, indexAssignment, indexWorksheet, indexAnnouncement } from '../services/embedding.js';\nimport { enqueueRunJob } from '../workers/queues.js';\nimport { prisma } from '../lib/prisma.js';\nimport { TRPCError } from '@trpc/server';\nimport type { EmbeddingSourceType } from '@prisma/client';\n\nexport const embeddingRouter = createTRPCRouter({\n /**\n * Semantic search over class materials.\n */\n search: protectedProcedure\n .input(z.object({\n classId: z.string(),\n query: z.string().min(1).max(500),\n limit: z.number().min(1).max(20).default(5),\n sourceTypes: z.array(z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION'])).optional(),\n }))\n .query(async ({ input, ctx }) => {\n // Verify user has access to the class\n const userInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n OR: [\n { teachers: { some: { id: ctx.user!.id } } },\n { students: { some: { id: ctx.user!.id } } },\n ],\n },\n });\n\n if (!userInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Access denied' });\n }\n\n const results = await searchEmbeddings({\n classId: input.classId,\n query: input.query,\n limit: input.limit,\n sourceTypes: input.sourceTypes as EmbeddingSourceType[] | undefined,\n });\n\n return results;\n }),\n\n /**\n * Trigger re-indexing of a specific resource.\n * Teachers only.\n */\n reindex: protectedProcedure\n .input(z.object({\n classId: z.string(),\n sourceType: z.enum(['FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT', 'SECTION']),\n sourceId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n // Verify teacher access\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const result = await enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n }, {\n classId: input.classId,\n userId: ctx.user!.id,\n });\n\n return { runJobId: result.runJobId };\n }),\n\n /**\n * Bulk index all content for a class.\n * Teachers only. Useful for initial setup.\n */\n indexAll: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n // Enqueue all assignments\n const assignments = await prisma.assignment.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n // Enqueue all worksheets\n const worksheets = await prisma.worksheet.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n // Enqueue all announcements\n const announcements = await prisma.announcement.findMany({\n where: { classId: input.classId },\n select: { id: true },\n });\n\n const jobs: Promise<unknown>[] = [];\n\n for (const a of assignments) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'ASSIGNMENT',\n sourceId: a.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n for (const w of worksheets) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'WORKSHEET',\n sourceId: w.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n for (const ann of announcements) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: 'ANNOUNCEMENT',\n sourceId: ann.id,\n }, { classId: input.classId, userId: ctx.user!.id }));\n }\n\n await Promise.allSettled(jobs);\n\n return {\n queued: {\n assignments: assignments.length,\n worksheets: worksheets.length,\n announcements: announcements.length,\n },\n };\n }),\n});\n"],"names":[],"mappings":"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","debug_id":"2a73cd21-6669-5303-82a8-94d941a432bd"}
1
+ {"version":3,"file":"embedding.js","sources":["routers/embedding.ts"],"sourceRoot":"/","sourcesContent":["/**\n * tRPC router for embedding/RAG operations.\n * Provides search and indexing triggers for class content.\n */\nimport { z } from 'zod';\nimport { createTRPCRouter, protectedProcedure } from '../trpc.js';\nimport { searchEmbeddings } from '../services/embedding.js';\nimport { enqueueRunJob } from '../workers/queues.js';\nimport { prisma } from '../lib/prisma.js';\nimport { TRPCError } from '@trpc/server';\nimport type { EmbeddingSourceType } from '@prisma/client';\n\nconst sourceTypeEnum = z.enum([\n 'FILE', 'ASSIGNMENT', 'WORKSHEET', 'ANNOUNCEMENT',\n 'SECTION', 'DISCUSSION', 'SUBMISSION', 'SYLLABUS',\n]);\n\nexport const embeddingRouter = createTRPCRouter({\n /**\n * Semantic search over class materials.\n */\n search: protectedProcedure\n .input(z.object({\n classId: z.string(),\n query: z.string().min(1).max(500),\n limit: z.number().min(1).max(20).default(5),\n sourceTypes: z.array(sourceTypeEnum).optional(),\n }))\n .query(async ({ input, ctx }) => {\n const userInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n OR: [\n { teachers: { some: { id: ctx.user!.id } } },\n { students: { some: { id: ctx.user!.id } } },\n ],\n },\n });\n\n if (!userInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Access denied' });\n }\n\n const results = await searchEmbeddings({\n classId: input.classId,\n query: input.query,\n limit: input.limit,\n sourceTypes: input.sourceTypes as EmbeddingSourceType[] | undefined,\n });\n\n return results;\n }),\n\n /**\n * Trigger re-indexing of a specific resource.\n * Teachers only.\n */\n reindex: protectedProcedure\n .input(z.object({\n classId: z.string(),\n sourceType: sourceTypeEnum,\n sourceId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const result = await enqueueRunJob('EMBED_CONTENT', {\n classId: input.classId,\n sourceType: input.sourceType,\n sourceId: input.sourceId,\n }, {\n classId: input.classId,\n userId: ctx.user!.id,\n });\n\n return { runJobId: result.runJobId };\n }),\n\n /**\n * Bulk index all content for a class.\n * Teachers only. Useful for initial setup.\n */\n indexAll: protectedProcedure\n .input(z.object({\n classId: z.string(),\n }))\n .mutation(async ({ input, ctx }) => {\n const teacherInClass = await prisma.class.findFirst({\n where: {\n id: input.classId,\n teachers: { some: { id: ctx.user!.id } },\n },\n });\n\n if (!teacherInClass) {\n throw new TRPCError({ code: 'FORBIDDEN', message: 'Teacher access required' });\n }\n\n const [assignments, worksheets, announcements, discussions, submissions, classData, classFiles] = await Promise.all([\n prisma.assignment.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.worksheet.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.announcement.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.discussion.findMany({ where: { classId: input.classId }, select: { id: true } }),\n prisma.submission.findMany({\n where: { assignment: { classId: input.classId }, gradeReceived: { not: null } },\n select: { id: true },\n }),\n prisma.class.findUnique({ where: { id: input.classId }, select: { syllabus: true } }),\n prisma.folder.findUnique({\n where: { classId: input.classId },\n select: { files: { select: { id: true }, where: { uploadStatus: 'COMPLETED' } } },\n }),\n ]);\n\n const jobs: Promise<unknown>[] = [];\n const opts = { classId: input.classId, userId: ctx.user!.id };\n\n for (const a of assignments) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ASSIGNMENT', sourceId: a.id }, opts));\n }\n for (const w of worksheets) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'WORKSHEET', sourceId: w.id }, opts));\n }\n for (const ann of announcements) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'ANNOUNCEMENT', sourceId: ann.id }, opts));\n }\n for (const d of discussions) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'DISCUSSION', sourceId: d.id }, opts));\n }\n for (const s of submissions) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SUBMISSION', sourceId: s.id }, opts));\n }\n if (classData?.syllabus) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'SYLLABUS', sourceId: input.classId }, opts));\n }\n const files = classFiles?.files ?? [];\n for (const f of files) {\n jobs.push(enqueueRunJob('EMBED_CONTENT', { classId: input.classId, sourceType: 'FILE', sourceId: f.id }, opts));\n }\n\n await Promise.allSettled(jobs);\n\n return {\n queued: {\n assignments: assignments.length,\n worksheets: worksheets.length,\n announcements: announcements.length,\n discussions: discussions.length,\n submissions: submissions.length,\n syllabus: classData?.syllabus ? 1 : 0,\n files: files.length,\n },\n };\n }),\n});\n"],"names":[],"mappings":"AAAA;;;GAGG;;;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IAC5B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc;IACjD,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU;CAClD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;IAC9C;;OAEG;IACH,MAAM,EAAE,kBAAkB;SACvB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE;KAChD,CAAC,CAAC;SACF,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;QAC9B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAC/C,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,EAAE,EAAE;oBACF,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE,EAAE;oBAC5C,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE,EAAE;iBAC7C;aACF;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC;YACrC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAgD;SACpE,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEJ;;;OAGG;IACH,OAAO,EAAE,kBAAkB;SACxB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,cAAc;QAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC;SACF,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;QACjC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAClD,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE;aACzC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE;YAClD,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,EAAE;YACD,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE;SACrB,CAAC,CAAC;QAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACvC,CAAC,CAAC;IAEJ;;;OAGG;IACH,QAAQ,EAAE,kBAAkB;SACzB,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CAAC;SACF,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;QACjC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;YAClD,KAAK,EAAE;gBACL,EAAE,EAAE,KAAK,CAAC,OAAO;gBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,EAAE;aACzC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAClH,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACvF,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACtF,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACzF,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACvF,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACzB,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAC/E,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;aACrB,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;YACrF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;gBACvB,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;gBACjC,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;aAClF,CAAC;SACH,CAAC,CAAC;QAEH,MAAM,IAAI,GAAuB,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,IAAK,CAAC,EAAE,EAAE,CAAC;QAE9D,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACxH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACvH,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5H,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACxH,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACxH,CAAC;QACD,IAAI,SAAS,EAAE,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/H,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAE/B,OAAO;YACL,MAAM,EAAE;gBACN,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,UAAU,EAAE,UAAU,CAAC,MAAM;gBAC7B,aAAa,EAAE,aAAa,CAAC,MAAM;gBACnC,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,WAAW,EAAE,WAAW,CAAC,MAAM;gBAC/B,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrC,KAAK,EAAE,KAAK,CAAC,MAAM;aACpB;SACF,CAAC;IACJ,CAAC,CAAC;CACL,CAAC,CAAC","debug_id":"6aa753e1-b0da-52b8-9e5c-afa887df290b"}
@@ -73,6 +73,11 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
73
73
  title: string;
74
74
  dueDate: Date;
75
75
  maxGrade: number | null;
76
+ attachments: {
77
+ type: string;
78
+ id: string;
79
+ name: string;
80
+ }[];
76
81
  instructions: string;
77
82
  graded: boolean;
78
83
  weight: number;
@@ -80,11 +85,6 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
80
85
  id: string;
81
86
  username: string;
82
87
  };
83
- attachments: {
84
- type: string;
85
- id: string;
86
- name: string;
87
- }[];
88
88
  }[];
89
89
  } & {
90
90
  id: string;
@@ -177,15 +177,15 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
177
177
  id: string;
178
178
  name: string;
179
179
  } | null;
180
- teacher: {
181
- id: string;
182
- username: string;
183
- };
184
180
  attachments: {
185
181
  type: string;
186
182
  id: string;
187
183
  name: string;
188
184
  }[];
185
+ teacher: {
186
+ id: string;
187
+ username: string;
188
+ };
189
189
  } & {
190
190
  type: import(".prisma/client").$Enums.AssignmentType;
191
191
  id: string;
@@ -226,15 +226,15 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
226
226
  id: string;
227
227
  name: string;
228
228
  } | null;
229
- teacher: {
230
- id: string;
231
- username: string;
232
- };
233
229
  attachments: {
234
230
  type: string;
235
231
  id: string;
236
232
  name: string;
237
233
  }[];
234
+ teacher: {
235
+ id: string;
236
+ username: string;
237
+ };
238
238
  } & {
239
239
  type: import(".prisma/client").$Enums.AssignmentType;
240
240
  id: string;
@@ -279,6 +279,11 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
279
279
  title: string;
280
280
  dueDate: Date;
281
281
  maxGrade: number | null;
282
+ attachments: {
283
+ type: string;
284
+ id: string;
285
+ name: string;
286
+ }[];
282
287
  instructions: string;
283
288
  graded: boolean;
284
289
  weight: number;
@@ -286,11 +291,6 @@ export declare const eventRouter: import("@trpc/server").TRPCBuiltRouter<{
286
291
  id: string;
287
292
  username: string;
288
293
  };
289
- attachments: {
290
- type: string;
291
- id: string;
292
- name: string;
293
- }[];
294
294
  }[];
295
295
  };
296
296
  meta: object;
@@ -55,6 +55,7 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
55
55
  submissionId: string | null;
56
56
  thumbnailId: string | null;
57
57
  annotationId: string | null;
58
+ conversationId: string | null;
58
59
  uploadStatus: import(".prisma/client").$Enums.UploadStatus;
59
60
  uploadUrl: string | null;
60
61
  uploadExpiresAt: Date | null;
@@ -66,7 +67,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
66
67
  cleanupAt: Date | null;
67
68
  classDraftId: string | null;
68
69
  folderId: string | null;
69
- conversationId: string | null;
70
70
  messageId: string | null;
71
71
  announcementId: string | null;
72
72
  discussionId: string | null;
@@ -97,6 +97,7 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
97
97
  submissionId: string | null;
98
98
  thumbnailId: string | null;
99
99
  annotationId: string | null;
100
+ conversationId: string | null;
100
101
  uploadStatus: import(".prisma/client").$Enums.UploadStatus;
101
102
  uploadUrl: string | null;
102
103
  uploadExpiresAt: Date | null;
@@ -108,7 +109,6 @@ export declare const fileRouter: import("@trpc/server").TRPCBuiltRouter<{
108
109
  cleanupAt: Date | null;
109
110
  classDraftId: string | null;
110
111
  folderId: string | null;
111
- conversationId: string | null;
112
112
  messageId: string | null;
113
113
  announcementId: string | null;
114
114
  discussionId: string | null;
@@ -42,8 +42,8 @@ export declare const labChatRouter: import("@trpc/server").TRPCBuiltRouter<{
42
42
  } & {
43
43
  id: string;
44
44
  userId: string;
45
- conversationId: string;
46
45
  role: import(".prisma/client").$Enums.ConversationRole;
46
+ conversationId: string;
47
47
  joinedAt: Date;
48
48
  hiddenAt: Date | null;
49
49
  lastViewedAt: Date | null;
@@ -101,8 +101,8 @@ export declare const labChatRouter: import("@trpc/server").TRPCBuiltRouter<{
101
101
  } & {
102
102
  id: string;
103
103
  userId: string;
104
- conversationId: string;
105
104
  role: import(".prisma/client").$Enums.ConversationRole;
105
+ conversationId: string;
106
106
  joinedAt: Date;
107
107
  hiddenAt: Date | null;
108
108
  lastViewedAt: Date | null;
@@ -167,9 +167,9 @@ export declare const labChatRouter: import("@trpc/server").TRPCBuiltRouter<{
167
167
  id: string;
168
168
  createdAt: Date;
169
169
  content: string;
170
+ senderId: string;
170
171
  conversationId: string;
171
172
  runJobId: string | null;
172
- senderId: string;
173
173
  };
174
174
  messageCount: number;
175
175
  }[];
@@ -30,9 +30,9 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
30
30
  createdAt: Date;
31
31
  title: string;
32
32
  content: string;
33
+ senderId: string | null;
33
34
  read: boolean;
34
35
  receiverId: string;
35
- senderId: string | null;
36
36
  })[];
37
37
  meta: object;
38
38
  }>;
@@ -52,9 +52,9 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
52
52
  createdAt: Date;
53
53
  title: string;
54
54
  content: string;
55
+ senderId: string | null;
55
56
  read: boolean;
56
57
  receiverId: string;
57
- senderId: string | null;
58
58
  };
59
59
  meta: object;
60
60
  }>;
@@ -69,9 +69,9 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
69
69
  createdAt: Date;
70
70
  title: string;
71
71
  content: string;
72
+ senderId: string | null;
72
73
  read: boolean;
73
74
  receiverId: string;
74
- senderId: string | null;
75
75
  };
76
76
  meta: object;
77
77
  }>;
@@ -100,9 +100,9 @@ export declare const notificationRouter: import("@trpc/server").TRPCBuiltRouter<
100
100
  createdAt: Date;
101
101
  title: string;
102
102
  content: string;
103
+ senderId: string | null;
103
104
  read: boolean;
104
105
  receiverId: string;
105
- senderId: string | null;
106
106
  };
107
107
  meta: object;
108
108
  }>;
@@ -25,7 +25,7 @@ export declare const searchRouter: import("@trpc/server").TRPCBuiltRouter<{
25
25
  query: string;
26
26
  results: {
27
27
  id: string;
28
- type: "class" | "file" | "assignment" | "announcement" | "section" | "event" | "worksheet" | "syllabus";
28
+ type: "class" | "file" | "assignment" | "announcement" | "discussion" | "submission" | "section" | "event" | "worksheet" | "syllabus";
29
29
  title: string;
30
30
  subtitle: string;
31
31
  classId: string;
@@ -46,7 +46,7 @@ export declare const searchRouter: import("@trpc/server").TRPCBuiltRouter<{
46
46
  query: string;
47
47
  results: {
48
48
  id: string;
49
- type: "class" | "file" | "assignment" | "announcement" | "section" | "event" | "worksheet" | "syllabus";
49
+ type: "class" | "file" | "assignment" | "announcement" | "discussion" | "submission" | "section" | "event" | "worksheet" | "syllabus";
50
50
  title: string;
51
51
  subtitle: string;
52
52
  classId: string;