@studious-lms/server 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.github/workflows/deploy.yml +1 -1
  2. package/dist/instrument.js +3 -3
  3. package/dist/instrument.js.map +1 -1
  4. package/dist/lib/inferDocumentFormat.d.ts +10 -0
  5. package/dist/lib/inferDocumentFormat.d.ts.map +1 -0
  6. package/dist/lib/inferDocumentFormat.js +48 -0
  7. package/dist/lib/inferDocumentFormat.js.map +1 -0
  8. package/dist/lib/legal.d.ts +3 -0
  9. package/dist/lib/legal.d.ts.map +1 -0
  10. package/dist/lib/legal.js +6 -0
  11. package/dist/lib/legal.js.map +1 -0
  12. package/dist/models/announcement.d.ts +47 -45
  13. package/dist/models/announcement.d.ts.map +1 -1
  14. package/dist/models/assignment.d.ts +75 -75
  15. package/dist/models/auth.d.ts +8 -0
  16. package/dist/models/auth.d.ts.map +1 -1
  17. package/dist/models/auth.js +4 -2
  18. package/dist/models/auth.js.map +1 -1
  19. package/dist/models/class.d.ts +13 -13
  20. package/dist/models/comment.d.ts +6 -6
  21. package/dist/models/conversation.d.ts +23 -23
  22. package/dist/models/event.d.ts +20 -18
  23. package/dist/models/event.d.ts.map +1 -1
  24. package/dist/models/file.d.ts +33 -9
  25. package/dist/models/file.d.ts.map +1 -1
  26. package/dist/models/labChat.d.ts +4 -4
  27. package/dist/models/marketing.d.ts +2 -15
  28. package/dist/models/marketing.d.ts.map +1 -1
  29. package/dist/models/marketing.js +12 -4
  30. package/dist/models/marketing.js.map +1 -1
  31. package/dist/models/message.d.ts +13 -13
  32. package/dist/models/newtonChat.d.ts +3 -3
  33. package/dist/models/notification.d.ts +4 -4
  34. package/dist/models/worksheet.d.ts +121 -121
  35. package/dist/pipelines/aiLabChat.d.ts +7 -1
  36. package/dist/pipelines/aiLabChat.d.ts.map +1 -1
  37. package/dist/pipelines/aiLabChat.js +153 -67
  38. package/dist/pipelines/aiLabChat.js.map +1 -1
  39. package/dist/pipelines/aiLabChatContract.d.ts +34 -195
  40. package/dist/pipelines/aiLabChatContract.d.ts.map +1 -1
  41. package/dist/pipelines/aiLabChatContract.js +9 -19
  42. package/dist/pipelines/aiLabChatContract.js.map +1 -1
  43. package/dist/pipelines/gradeWorksheet.d.ts +6 -6
  44. package/dist/pipelines/labChatPrompt.d.ts +8 -3
  45. package/dist/pipelines/labChatPrompt.d.ts.map +1 -1
  46. package/dist/pipelines/labChatPrompt.js +52 -14
  47. package/dist/pipelines/labChatPrompt.js.map +1 -1
  48. package/dist/pipelines/pdfToWorksheet.d.ts +1 -1
  49. package/dist/routers/_app.d.ts +750 -546
  50. package/dist/routers/_app.d.ts.map +1 -1
  51. package/dist/routers/announcement.d.ts +40 -40
  52. package/dist/routers/assignment.d.ts +131 -121
  53. package/dist/routers/assignment.d.ts.map +1 -1
  54. package/dist/routers/auth.d.ts +2 -0
  55. package/dist/routers/auth.d.ts.map +1 -1
  56. package/dist/routers/auth.js +15 -2
  57. package/dist/routers/auth.js.map +1 -1
  58. package/dist/routers/class.d.ts +12 -8
  59. package/dist/routers/class.d.ts.map +1 -1
  60. package/dist/routers/comment.d.ts +5 -5
  61. package/dist/routers/conversation.d.ts +6 -6
  62. package/dist/routers/discussion.d.ts +3 -3
  63. package/dist/routers/embedding.d.ts +6 -2
  64. package/dist/routers/embedding.d.ts.map +1 -1
  65. package/dist/routers/embedding.js +44 -36
  66. package/dist/routers/embedding.js.map +1 -1
  67. package/dist/routers/event.d.ts +20 -18
  68. package/dist/routers/event.d.ts.map +1 -1
  69. package/dist/routers/file.d.ts +2 -2
  70. package/dist/routers/labChat.d.ts +3 -3
  71. package/dist/routers/marketing.d.ts +0 -13
  72. package/dist/routers/marketing.d.ts.map +1 -1
  73. package/dist/routers/notifications.d.ts +4 -4
  74. package/dist/routers/school.d.ts +4 -0
  75. package/dist/routers/school.d.ts.map +1 -1
  76. package/dist/routers/search.d.ts +2 -2
  77. package/dist/routers/user.d.ts +89 -0
  78. package/dist/routers/user.d.ts.map +1 -1
  79. package/dist/routers/user.js +19 -2
  80. package/dist/routers/user.js.map +1 -1
  81. package/dist/routers/worksheet.d.ts +44 -44
  82. package/dist/routes/aiStream.d.ts.map +1 -1
  83. package/dist/routes/aiStream.js +41 -11
  84. package/dist/routes/aiStream.js.map +1 -1
  85. package/dist/seedDatabase.d.ts +3 -1
  86. package/dist/seedDatabase.d.ts.map +1 -1
  87. package/dist/services/aiChatStream.d.ts +20 -0
  88. package/dist/services/aiChatStream.d.ts.map +1 -1
  89. package/dist/services/aiChatStream.js +110 -13
  90. package/dist/services/aiChatStream.js.map +1 -1
  91. package/dist/services/aiModifierTools.d.ts +0 -16
  92. package/dist/services/aiModifierTools.d.ts.map +1 -1
  93. package/dist/services/aiModifierTools.js +112 -3
  94. package/dist/services/aiModifierTools.js.map +1 -1
  95. package/dist/services/aiProposalTools.d.ts.map +1 -1
  96. package/dist/services/aiProposalTools.js +25 -25
  97. package/dist/services/aiProposalTools.js.map +1 -1
  98. package/dist/services/aiTools.js +3 -3
  99. package/dist/services/aiTools.js.map +1 -1
  100. package/dist/services/announcement.d.ts +34 -34
  101. package/dist/services/assignment.d.ts +121 -111
  102. package/dist/services/assignment.d.ts.map +1 -1
  103. package/dist/services/assignment.js +4 -2
  104. package/dist/services/assignment.js.map +1 -1
  105. package/dist/services/auth.d.ts +2 -0
  106. package/dist/services/auth.d.ts.map +1 -1
  107. package/dist/services/auth.js +13 -4
  108. package/dist/services/auth.js.map +1 -1
  109. package/dist/services/class.d.ts +10 -6
  110. package/dist/services/class.d.ts.map +1 -1
  111. package/dist/services/class.js +7 -3
  112. package/dist/services/class.js.map +1 -1
  113. package/dist/services/comment.d.ts +5 -5
  114. package/dist/services/conversation.d.ts +6 -6
  115. package/dist/services/discussion.d.ts.map +1 -1
  116. package/dist/services/discussion.js +9 -2
  117. package/dist/services/discussion.js.map +1 -1
  118. package/dist/services/embedding.d.ts +19 -1
  119. package/dist/services/embedding.d.ts.map +1 -1
  120. package/dist/services/embedding.js +154 -8
  121. package/dist/services/embedding.js.map +1 -1
  122. package/dist/services/event.d.ts +20 -18
  123. package/dist/services/event.d.ts.map +1 -1
  124. package/dist/services/file.d.ts +4 -4
  125. package/dist/services/folder.d.ts.map +1 -1
  126. package/dist/services/folder.js +32 -2
  127. package/dist/services/folder.js.map +1 -1
  128. package/dist/services/labChat.d.ts +3 -3
  129. package/dist/services/marketing.d.ts +1 -14
  130. package/dist/services/marketing.d.ts.map +1 -1
  131. package/dist/services/marketing.js +5 -5
  132. package/dist/services/marketing.js.map +1 -1
  133. package/dist/services/notification.d.ts +4 -4
  134. package/dist/services/openaiDocumentGen.d.ts +37 -0
  135. package/dist/services/openaiDocumentGen.d.ts.map +1 -0
  136. package/dist/services/openaiDocumentGen.js +262 -0
  137. package/dist/services/openaiDocumentGen.js.map +1 -0
  138. package/dist/services/school.d.ts +4 -0
  139. package/dist/services/school.d.ts.map +1 -1
  140. package/dist/services/search.d.ts +1 -1
  141. package/dist/services/search.d.ts.map +1 -1
  142. package/dist/services/search.js +27 -2
  143. package/dist/services/search.js.map +1 -1
  144. package/dist/services/userPrivacy.d.ts +86 -0
  145. package/dist/services/userPrivacy.d.ts.map +1 -0
  146. package/dist/services/userPrivacy.js +184 -0
  147. package/dist/services/userPrivacy.js.map +1 -0
  148. package/dist/services/worksheet.d.ts +66 -49
  149. package/dist/services/worksheet.d.ts.map +1 -1
  150. package/dist/services/worksheet.js +48 -3
  151. package/dist/services/worksheet.js.map +1 -1
  152. package/dist/utils/email.d.ts.map +1 -1
  153. package/dist/utils/email.js +7 -3
  154. package/dist/utils/email.js.map +1 -1
  155. package/dist/workers/processors/embedContent.d.ts.map +1 -1
  156. package/dist/workers/processors/embedContent.js +16 -25
  157. package/dist/workers/processors/embedContent.js.map +1 -1
  158. package/package.json +1 -1
  159. package/prisma/migrations/20260610140000_expand_embedding_source_types/migration.sql +4 -0
  160. package/prisma/migrations/20260611120000_add_user_terms_acceptance/migration.sql +3 -0
  161. package/prisma/schema.prisma +6 -0
  162. package/src/instrument.ts +1 -1
  163. package/src/lib/inferDocumentFormat.ts +58 -0
  164. package/src/lib/legal.ts +2 -0
  165. package/src/models/auth.ts +4 -0
  166. package/src/models/marketing.ts +10 -2
  167. package/src/pipelines/aiLabChat.ts +198 -74
  168. package/src/pipelines/aiLabChatContract.ts +7 -17
  169. package/src/pipelines/labChatPrompt.ts +64 -14
  170. package/src/routers/auth.ts +13 -0
  171. package/src/routers/embedding.ts +44 -39
  172. package/src/routers/user.ts +26 -0
  173. package/src/routes/aiStream.ts +47 -9
  174. package/src/services/aiChatStream.ts +133 -11
  175. package/src/services/aiModifierTools.ts +154 -1
  176. package/src/services/aiProposalTools.ts +27 -25
  177. package/src/services/aiTools.ts +1 -1
  178. package/src/services/assignment.ts +3 -0
  179. package/src/services/auth.ts +14 -2
  180. package/src/services/class.ts +7 -1
  181. package/src/services/discussion.ts +13 -0
  182. package/src/services/embedding.ts +167 -6
  183. package/src/services/folder.ts +31 -0
  184. package/src/services/marketing.ts +3 -3
  185. package/src/services/openaiDocumentGen.ts +319 -0
  186. package/src/services/search.ts +25 -1
  187. package/src/services/userPrivacy.ts +196 -0
  188. package/src/services/worksheet.ts +68 -1
  189. package/src/utils/email.ts +5 -1
  190. package/src/workers/processors/embedContent.ts +18 -22
  191. package/tests/helpers/registerInput.ts +20 -0
  192. package/tests/integration/globalSetup.ts +10 -18
  193. package/tests/integration/routers/auth.test.ts +13 -18
  194. package/tests/unit/lib/inferDocumentFormat.test.ts +33 -0
  195. package/tests/unit/services/aiChatStream.test.ts +92 -0
  196. package/tests/unit/services/openaiDocumentGen.test.ts +65 -0
@@ -1 +1 @@
1
- {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyuB3B,CAAC"}
1
+ {"version":3,"file":"assignment.d.ts","sourceRoot":"/","sources":["routers/assignment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAA2B,KAAK,gBAAgB,EAAgE,MAAM,sBAAsB,CAAC;AAmPpJ,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyuB3B,CAAC"}
@@ -21,7 +21,9 @@ export declare const authRouter: import("@trpc/server").TRPCBuiltRouter<{
21
21
  username: string;
22
22
  email: string;
23
23
  password: string;
24
+ termsVersion: "2025-11";
24
25
  confirmPassword: string;
26
+ agreeToTerms: true;
25
27
  };
26
28
  output: {
27
29
  user: {
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmCxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DrB,CAAC"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"/","sources":["routers/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8CxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DrB,CAAC"}
@@ -1,8 +1,9 @@
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]="3c1fd22e-5583-52a3-9f05-0ba551964a14")}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]="d1a28eb6-8a65-51d4-91b1-0850796f9caf")}catch(e){}}();
3
3
  import { z } from "zod";
4
4
  import { TRPCError } from "@trpc/server";
5
5
  import { createTRPCRouter, protectedProcedure, publicProcedure, } from "../trpc.js";
6
+ import { CURRENT_TERMS_VERSION } from "../lib/legal.js";
6
7
  import { register, login, logout, check, resendVerificationEmail, verify, requestPasswordReset, resetPassword, } from "../services/auth.js";
7
8
  const loginSchema = z.object({
8
9
  username: z.string(),
@@ -14,6 +15,16 @@ const registerSchema = z
14
15
  email: z.string().email("Invalid email address"),
15
16
  password: z.string().min(6, "Password must be at least 6 characters"),
16
17
  confirmPassword: z.string(),
18
+ agreeToTerms: z.literal(true, {
19
+ errorMap: () => ({
20
+ message: "You must accept the Terms of Service and Privacy Policy",
21
+ }),
22
+ }),
23
+ termsVersion: z.literal(CURRENT_TERMS_VERSION, {
24
+ errorMap: () => ({
25
+ message: "Please accept the current Terms of Service and Privacy Policy",
26
+ }),
27
+ }),
17
28
  })
18
29
  .refine((data) => data.password === data.confirmPassword, {
19
30
  message: "Passwords don't match",
@@ -26,6 +37,8 @@ export const authRouter = createTRPCRouter({
26
37
  username: input.username,
27
38
  email: input.email,
28
39
  password: input.password,
40
+ agreeToTerms: input.agreeToTerms,
41
+ termsVersion: input.termsVersion,
29
42
  })),
30
43
  login: publicProcedure
31
44
  .input(loginSchema)
@@ -71,4 +84,4 @@ export const authRouter = createTRPCRouter({
71
84
  .mutation(({ input }) => resetPassword(input.token, input.password)),
72
85
  });
73
86
  //# sourceMappingURL=auth.js.map
74
- //# debugId=3c1fd22e-5583-52a3-9f05-0ba551964a14
87
+ //# debugId=d1a28eb6-8a65-51d4-91b1-0850796f9caf
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sources":["routers/auth.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n createTRPCRouter,\n protectedProcedure,\n publicProcedure,\n} from \"../trpc.js\";\nimport {\n register,\n login,\n logout,\n check,\n resendVerificationEmail,\n verify,\n requestPasswordReset,\n resetPassword,\n} from \"../services/auth.js\";\n\nconst loginSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\n\nconst registerSchema = z\n .object({\n username: z.string().min(3, \"Username must be at least 3 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n });\n\nexport const authRouter = createTRPCRouter({\n register: publicProcedure\n .input(registerSchema)\n .mutation(({ input }) =>\n register({\n username: input.username,\n email: input.email,\n password: input.password,\n })\n ),\n\n login: publicProcedure\n .input(loginSchema)\n .mutation(({ input }) => login(input)),\n\n logout: protectedProcedure.mutation(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return logout(ctx.user.id);\n }),\n\n check: protectedProcedure.query(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return check(ctx.user.id);\n }),\n\n resendVerificationEmail: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => resendVerificationEmail(input.email)),\n\n verify: publicProcedure\n .input(z.object({ token: z.string() }))\n .mutation(({ input }) => verify(input.token)),\n\n requestPasswordReset: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => requestPasswordReset(input.email)),\n\n resetPassword: publicProcedure\n .input(\n z\n .object({\n token: z.string(),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n })\n )\n .mutation(({ input }) => resetPassword(input.token, input.password)),\n});\n"],"names":[],"mappings":"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","debug_id":"3c1fd22e-5583-52a3-9f05-0ba551964a14"}
1
+ {"version":3,"file":"auth.js","sources":["routers/auth.ts"],"sourceRoot":"/","sourcesContent":["import { z } from \"zod\";\nimport { TRPCError } from \"@trpc/server\";\nimport {\n createTRPCRouter,\n protectedProcedure,\n publicProcedure,\n} from \"../trpc.js\";\nimport { CURRENT_TERMS_VERSION } from \"../lib/legal.js\";\nimport {\n register,\n login,\n logout,\n check,\n resendVerificationEmail,\n verify,\n requestPasswordReset,\n resetPassword,\n} from \"../services/auth.js\";\n\nconst loginSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\n\nconst registerSchema = z\n .object({\n username: z.string().min(3, \"Username must be at least 3 characters\"),\n email: z.string().email(\"Invalid email address\"),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n agreeToTerms: z.literal(true, {\n errorMap: () => ({\n message: \"You must accept the Terms of Service and Privacy Policy\",\n }),\n }),\n termsVersion: z.literal(CURRENT_TERMS_VERSION, {\n errorMap: () => ({\n message: \"Please accept the current Terms of Service and Privacy Policy\",\n }),\n }),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n });\n\nexport const authRouter = createTRPCRouter({\n register: publicProcedure\n .input(registerSchema)\n .mutation(({ input }) =>\n register({\n username: input.username,\n email: input.email,\n password: input.password,\n agreeToTerms: input.agreeToTerms,\n termsVersion: input.termsVersion,\n })\n ),\n\n login: publicProcedure\n .input(loginSchema)\n .mutation(({ input }) => login(input)),\n\n logout: protectedProcedure.mutation(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return logout(ctx.user.id);\n }),\n\n check: protectedProcedure.query(({ ctx }) => {\n if (!ctx.user) {\n throw new TRPCError({\n code: \"UNAUTHORIZED\",\n message: \"Not authenticated\",\n });\n }\n return check(ctx.user.id);\n }),\n\n resendVerificationEmail: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => resendVerificationEmail(input.email)),\n\n verify: publicProcedure\n .input(z.object({ token: z.string() }))\n .mutation(({ input }) => verify(input.token)),\n\n requestPasswordReset: publicProcedure\n .input(z.object({ email: z.string().email() }))\n .mutation(({ input }) => requestPasswordReset(input.email)),\n\n resetPassword: publicProcedure\n .input(\n z\n .object({\n token: z.string(),\n password: z.string().min(6, \"Password must be at least 6 characters\"),\n confirmPassword: z.string(),\n })\n .refine((data) => data.password === data.confirmPassword, {\n message: \"Passwords don't match\",\n path: [\"confirmPassword\"],\n })\n )\n .mutation(({ input }) => resetPassword(input.token, input.password)),\n});\n"],"names":[],"mappings":"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","debug_id":"d1a28eb6-8a65-51d4-91b1-0850796f9caf"}
@@ -297,6 +297,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
297
297
  email: string;
298
298
  password: string;
299
299
  verified: boolean;
300
+ termsAcceptedAt: Date | null;
301
+ termsVersion: string | null;
300
302
  schoolId: string | null;
301
303
  }[];
302
304
  students: {
@@ -305,6 +307,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
305
307
  email: string;
306
308
  password: string;
307
309
  verified: boolean;
310
+ termsAcceptedAt: Date | null;
311
+ termsVersion: string | null;
308
312
  schoolId: string | null;
309
313
  }[];
310
314
  } & {
@@ -359,7 +363,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
359
363
  input: {
360
364
  [x: string]: unknown;
361
365
  classId: string;
362
- type: "teacher" | "student";
366
+ type: "student" | "teacher";
363
367
  userId: string;
364
368
  };
365
369
  output: {
@@ -377,7 +381,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
377
381
  studentsCanReply: boolean;
378
382
  };
379
383
  user: {
380
- type: "teacher" | "student";
384
+ type: "student" | "teacher";
381
385
  id: string;
382
386
  username: string;
383
387
  };
@@ -479,8 +483,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
479
483
  id: string;
480
484
  createdAt: Date;
481
485
  assignmentId: string;
482
- modifiedAt: Date;
483
486
  studentId: string;
487
+ modifiedAt: Date;
484
488
  extendedResponse: string | null;
485
489
  gradeReceived: number | null;
486
490
  recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
@@ -515,8 +519,8 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
515
519
  id: string;
516
520
  createdAt: Date;
517
521
  assignmentId: string;
518
- modifiedAt: Date;
519
522
  studentId: string;
523
+ modifiedAt: Date;
520
524
  extendedResponse: string | null;
521
525
  gradeReceived: number | null;
522
526
  recommendationState: import(".prisma/client").$Enums.SubmissionRecommendationState;
@@ -744,7 +748,7 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
744
748
  input: {
745
749
  [x: string]: unknown;
746
750
  classId: string;
747
- type: "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "DISCUSSION" | "PRESENTATION" | "LAB" | "OTHER";
751
+ type: "DISCUSSION" | "HOMEWORK" | "QUIZ" | "TEST" | "PROJECT" | "ESSAY" | "PRESENTATION" | "LAB" | "OTHER";
748
752
  title: string;
749
753
  instructions: string;
750
754
  dueDate?: Date | undefined;
@@ -1017,11 +1021,11 @@ export declare const classRouter: import("@trpc/server").TRPCBuiltRouter<{
1017
1021
  type: import(".prisma/client").$Enums.WorksheetQuestionType;
1018
1022
  options: import("@prisma/client/runtime/library.js").JsonValue;
1019
1023
  markScheme: import("@prisma/client/runtime/library.js").JsonValue;
1020
- order: number | null;
1021
- worksheetId: string;
1024
+ points: number;
1022
1025
  question: string;
1026
+ worksheetId: string;
1027
+ order: number | null;
1023
1028
  answer: string;
1024
- points: number;
1025
1029
  }[];
1026
1030
  }[];
1027
1031
  markSchemes: {
@@ -1 +1 @@
1
- {"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuStB,CAAC"}
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"/","sources":["routers/class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA2CxB,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuStB,CAAC"}
@@ -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":"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","debug_id":"6aa753e1-b0da-52b8-9e5c-afa887df290b"}