@goscribe/server 1.5.0 → 1.7.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 (321) hide show
  1. package/dist/context.d.ts +14 -1
  2. package/dist/context.js +23 -2
  3. package/dist/generated/prisma/client.d.ts +224 -0
  4. package/dist/generated/prisma/client.js +34 -0
  5. package/dist/generated/prisma/commonInputTypes.d.ts +941 -0
  6. package/dist/generated/prisma/commonInputTypes.js +10 -0
  7. package/dist/generated/prisma/enums.d.ts +67 -0
  8. package/dist/generated/prisma/enums.js +66 -0
  9. package/dist/generated/prisma/internal/class.d.ts +539 -0
  10. package/dist/generated/prisma/internal/class.js +49 -0
  11. package/dist/generated/prisma/internal/prismaNamespace.d.ts +3924 -0
  12. package/dist/generated/prisma/internal/prismaNamespace.js +557 -0
  13. package/dist/generated/prisma/models/ActivityLog.d.ts +1847 -0
  14. package/dist/generated/prisma/models/ActivityLog.js +1 -0
  15. package/dist/generated/prisma/models/Artifact.d.ts +2345 -0
  16. package/dist/generated/prisma/models/Artifact.js +1 -0
  17. package/dist/generated/prisma/models/ArtifactVersion.d.ts +1550 -0
  18. package/dist/generated/prisma/models/ArtifactVersion.js +1 -0
  19. package/dist/generated/prisma/models/Channel.d.ts +1257 -0
  20. package/dist/generated/prisma/models/Channel.js +1 -0
  21. package/dist/generated/prisma/models/Chat.d.ts +1339 -0
  22. package/dist/generated/prisma/models/Chat.js +1 -0
  23. package/dist/generated/prisma/models/CopilotConversation.d.ts +1450 -0
  24. package/dist/generated/prisma/models/CopilotConversation.js +1 -0
  25. package/dist/generated/prisma/models/CopilotMessage.d.ts +1179 -0
  26. package/dist/generated/prisma/models/CopilotMessage.js +1 -0
  27. package/dist/generated/prisma/models/FileAsset.d.ts +1832 -0
  28. package/dist/generated/prisma/models/FileAsset.js +1 -0
  29. package/dist/generated/prisma/models/Flashcard.d.ts +1460 -0
  30. package/dist/generated/prisma/models/Flashcard.js +1 -0
  31. package/dist/generated/prisma/models/FlashcardProgress.d.ts +1782 -0
  32. package/dist/generated/prisma/models/FlashcardProgress.js +1 -0
  33. package/dist/generated/prisma/models/Folder.d.ts +1685 -0
  34. package/dist/generated/prisma/models/Folder.js +1 -0
  35. package/dist/generated/prisma/models/IdempotencyRecord.d.ts +1319 -0
  36. package/dist/generated/prisma/models/IdempotencyRecord.js +1 -0
  37. package/dist/generated/prisma/models/Invoice.d.ts +1586 -0
  38. package/dist/generated/prisma/models/Invoice.js +1 -0
  39. package/dist/generated/prisma/models/KnowledgeBase.d.ts +1721 -0
  40. package/dist/generated/prisma/models/KnowledgeBase.js +1 -0
  41. package/dist/generated/prisma/models/KnowledgeBaseChunk.d.ts +1333 -0
  42. package/dist/generated/prisma/models/KnowledgeBaseChunk.js +1 -0
  43. package/dist/generated/prisma/models/KnowledgeBaseDocument.d.ts +1695 -0
  44. package/dist/generated/prisma/models/KnowledgeBaseDocument.js +1 -0
  45. package/dist/generated/prisma/models/Notification.d.ts +1992 -0
  46. package/dist/generated/prisma/models/Notification.js +1 -0
  47. package/dist/generated/prisma/models/PasswordResetToken.d.ts +1210 -0
  48. package/dist/generated/prisma/models/PasswordResetToken.js +1 -0
  49. package/dist/generated/prisma/models/Plan.d.ts +1431 -0
  50. package/dist/generated/prisma/models/Plan.js +1 -0
  51. package/dist/generated/prisma/models/PlanLimit.d.ts +1328 -0
  52. package/dist/generated/prisma/models/PlanLimit.js +1 -0
  53. package/dist/generated/prisma/models/PodcastSegment.d.ts +1564 -0
  54. package/dist/generated/prisma/models/PodcastSegment.js +1 -0
  55. package/dist/generated/prisma/models/ResourcePrice.d.ts +1008 -0
  56. package/dist/generated/prisma/models/ResourcePrice.js +1 -0
  57. package/dist/generated/prisma/models/Role.d.ts +1065 -0
  58. package/dist/generated/prisma/models/Role.js +1 -0
  59. package/dist/generated/prisma/models/Session.d.ts +1105 -0
  60. package/dist/generated/prisma/models/Session.js +1 -0
  61. package/dist/generated/prisma/models/StripeEvent.d.ts +1081 -0
  62. package/dist/generated/prisma/models/StripeEvent.js +1 -0
  63. package/dist/generated/prisma/models/StudyGuideComment.d.ts +1321 -0
  64. package/dist/generated/prisma/models/StudyGuideComment.js +1 -0
  65. package/dist/generated/prisma/models/StudyGuideHighlight.d.ts +1629 -0
  66. package/dist/generated/prisma/models/StudyGuideHighlight.js +1 -0
  67. package/dist/generated/prisma/models/Subscription.d.ts +1677 -0
  68. package/dist/generated/prisma/models/Subscription.js +1 -0
  69. package/dist/generated/prisma/models/User.d.ts +7559 -0
  70. package/dist/generated/prisma/models/User.js +1 -0
  71. package/dist/generated/prisma/models/UserCredit.d.ts +1249 -0
  72. package/dist/generated/prisma/models/UserCredit.js +1 -0
  73. package/dist/generated/prisma/models/VerificationToken.d.ts +946 -0
  74. package/dist/generated/prisma/models/VerificationToken.js +1 -0
  75. package/dist/generated/prisma/models/WorksheetPreset.d.ts +1433 -0
  76. package/dist/generated/prisma/models/WorksheetPreset.js +1 -0
  77. package/dist/generated/prisma/models/WorksheetQuestion.d.ts +1491 -0
  78. package/dist/generated/prisma/models/WorksheetQuestion.js +1 -0
  79. package/dist/generated/prisma/models/WorksheetQuestionProgress.d.ts +1620 -0
  80. package/dist/generated/prisma/models/WorksheetQuestionProgress.js +1 -0
  81. package/dist/generated/prisma/models/Workspace.d.ts +3620 -0
  82. package/dist/generated/prisma/models/Workspace.js +1 -0
  83. package/dist/generated/prisma/models/WorkspaceInvitation.d.ts +1490 -0
  84. package/dist/generated/prisma/models/WorkspaceInvitation.js +1 -0
  85. package/dist/generated/prisma/models/WorkspaceKnowledgeBase.d.ts +1410 -0
  86. package/dist/generated/prisma/models/WorkspaceKnowledgeBase.js +1 -0
  87. package/dist/generated/prisma/models/WorkspaceMember.d.ts +1326 -0
  88. package/dist/generated/prisma/models/WorkspaceMember.js +1 -0
  89. package/dist/generated/prisma/models.d.ts +39 -0
  90. package/dist/generated/prisma/models.js +1 -0
  91. package/dist/lib/ai/index.d.ts +3 -2
  92. package/dist/lib/ai/index.js +3 -2
  93. package/dist/lib/ai/llm-client.d.ts +1 -0
  94. package/dist/lib/ai/llm-client.js +17 -0
  95. package/dist/routers/_app.d.ts +40 -80
  96. package/dist/routers/auth.js +1 -1
  97. package/dist/routers/flashcards.d.ts +12 -1
  98. package/dist/routers/payment.d.ts +1 -12
  99. package/dist/routers/workspace.d.ts +27 -67
  100. package/dist/routers/workspace.js +1 -0
  101. package/dist/services/billing/payment.service.d.ts +1 -12
  102. package/dist/services/billing/payment.service.js +3 -6
  103. package/dist/services/billing/usage.service.d.ts +30 -10
  104. package/dist/services/billing/usage.service.js +87 -15
  105. package/dist/services/content/copilot.service.js +15 -29
  106. package/dist/services/content/flashcard-progress.service.js +9 -9
  107. package/dist/services/content/flashcard.service.d.ts +45 -1
  108. package/dist/services/content/flashcard.service.js +81 -68
  109. package/dist/services/content/media-analysis.service.js +27 -27
  110. package/dist/services/content/worksheet-generation.service.test.js +2 -2
  111. package/dist/services/workspace/workspace.service.d.ts +23 -67
  112. package/dist/services/workspace/workspace.service.js +69 -62
  113. package/dist/src/context.d.ts +27 -0
  114. package/dist/src/context.js +33 -0
  115. package/dist/src/index.d.ts +3 -0
  116. package/dist/src/index.js +1 -0
  117. package/dist/src/lib/ai/config.d.ts +20 -0
  118. package/dist/src/lib/ai/config.js +31 -0
  119. package/dist/src/lib/ai/embedding-client.d.ts +8 -0
  120. package/dist/src/lib/ai/embedding-client.js +30 -0
  121. package/dist/src/lib/ai/index.d.ts +48 -0
  122. package/dist/src/lib/ai/index.js +29 -0
  123. package/dist/src/lib/ai/inference-backend/client.d.ts +28 -0
  124. package/dist/src/lib/ai/inference-backend/client.js +301 -0
  125. package/dist/src/lib/ai/inference-backend/mocks.d.ts +12 -0
  126. package/dist/src/lib/ai/inference-backend/mocks.js +133 -0
  127. package/dist/src/lib/ai/inference-backend/types.d.ts +44 -0
  128. package/dist/src/lib/ai/inference-backend/types.js +1 -0
  129. package/dist/src/lib/ai/json-parse.d.ts +2 -0
  130. package/dist/src/lib/ai/json-parse.js +34 -0
  131. package/dist/src/lib/ai/llm-client.d.ts +7 -0
  132. package/dist/src/lib/ai/llm-client.js +36 -0
  133. package/dist/src/lib/ai/mock.d.ts +2 -0
  134. package/dist/src/lib/ai/mock.js +10 -0
  135. package/dist/src/lib/ai/types.d.ts +9 -0
  136. package/dist/src/lib/ai/types.js +1 -0
  137. package/dist/src/lib/auth.d.ts +36 -0
  138. package/dist/src/lib/auth.js +117 -0
  139. package/dist/src/lib/chunking.d.ts +19 -0
  140. package/dist/src/lib/chunking.js +47 -0
  141. package/dist/src/lib/constants.d.ts +13 -0
  142. package/dist/src/lib/constants.js +12 -0
  143. package/dist/src/lib/curated-kb-seed.d.ts +12 -0
  144. package/dist/src/lib/curated-kb-seed.js +155 -0
  145. package/dist/src/lib/email.d.ts +11 -0
  146. package/dist/src/lib/email.js +152 -0
  147. package/dist/src/lib/embeddings.d.ts +2 -0
  148. package/dist/src/lib/embeddings.js +1 -0
  149. package/dist/src/lib/ensure-curated-kb-catalog.d.ts +6 -0
  150. package/dist/src/lib/ensure-curated-kb-catalog.js +53 -0
  151. package/dist/src/lib/env.d.ts +41 -0
  152. package/dist/src/lib/env.js +57 -0
  153. package/dist/src/lib/errors.d.ts +33 -0
  154. package/dist/src/lib/errors.js +78 -0
  155. package/dist/src/lib/file.d.ts +0 -0
  156. package/dist/src/lib/file.js +1 -0
  157. package/dist/src/lib/inference.d.ts +1 -0
  158. package/dist/src/lib/inference.js +1 -0
  159. package/dist/src/lib/kb-meta.d.ts +8 -0
  160. package/dist/src/lib/kb-meta.js +77 -0
  161. package/dist/src/lib/logger.d.ts +62 -0
  162. package/dist/src/lib/logger.js +364 -0
  163. package/dist/src/lib/pdf.d.ts +11 -0
  164. package/dist/src/lib/pdf.js +11 -0
  165. package/dist/src/lib/prisma.d.ts +3 -0
  166. package/dist/src/lib/prisma.js +15 -0
  167. package/dist/src/lib/pusher.d.ts +38 -0
  168. package/dist/src/lib/pusher.js +170 -0
  169. package/dist/src/lib/retry.d.ts +15 -0
  170. package/dist/src/lib/retry.js +37 -0
  171. package/dist/src/lib/storage.d.ts +11 -0
  172. package/dist/src/lib/storage.js +71 -0
  173. package/dist/src/lib/stripe.d.ts +10 -0
  174. package/dist/src/lib/stripe.js +36 -0
  175. package/dist/src/lib/validation.d.ts +51 -0
  176. package/dist/src/lib/validation.js +64 -0
  177. package/dist/src/lib/workspace-kb.d.ts +5 -0
  178. package/dist/src/lib/workspace-kb.js +7 -0
  179. package/dist/src/repositories/artifact.repository.d.ts +64 -0
  180. package/dist/src/repositories/artifact.repository.js +40 -0
  181. package/dist/src/repositories/base.repository.d.ts +14 -0
  182. package/dist/src/repositories/base.repository.js +14 -0
  183. package/dist/src/repositories/invitation.repository.d.ts +104 -0
  184. package/dist/src/repositories/invitation.repository.js +44 -0
  185. package/dist/src/repositories/notification.repository.d.ts +76 -0
  186. package/dist/src/repositories/notification.repository.js +44 -0
  187. package/dist/src/repositories/user.repository.d.ts +84 -0
  188. package/dist/src/repositories/user.repository.js +37 -0
  189. package/dist/src/repositories/workspace-member.repository.d.ts +35 -0
  190. package/dist/src/repositories/workspace-member.repository.js +31 -0
  191. package/dist/src/repositories/workspace.repository.d.ts +101 -0
  192. package/dist/src/repositories/workspace.repository.js +79 -0
  193. package/dist/src/routers/_app.d.ts +3464 -0
  194. package/dist/src/routers/_app.js +36 -0
  195. package/dist/src/routers/admin.d.ts +358 -0
  196. package/dist/src/routers/admin.js +105 -0
  197. package/dist/src/routers/annotations.d.ts +219 -0
  198. package/dist/src/routers/annotations.js +29 -0
  199. package/dist/src/routers/artifactVersions.d.ts +65 -0
  200. package/dist/src/routers/artifactVersions.js +14 -0
  201. package/dist/src/routers/auth.d.ts +161 -0
  202. package/dist/src/routers/auth.js +97 -0
  203. package/dist/src/routers/chat.d.ts +170 -0
  204. package/dist/src/routers/chat.js +32 -0
  205. package/dist/src/routers/copilot.d.ts +200 -0
  206. package/dist/src/routers/copilot.js +52 -0
  207. package/dist/src/routers/flashcards.d.ts +336 -0
  208. package/dist/src/routers/flashcards.js +93 -0
  209. package/dist/src/routers/knowledgeBase.d.ts +421 -0
  210. package/dist/src/routers/knowledgeBase.js +118 -0
  211. package/dist/src/routers/members.d.ts +169 -0
  212. package/dist/src/routers/members.js +47 -0
  213. package/dist/src/routers/notifications.d.ts +99 -0
  214. package/dist/src/routers/notifications.js +25 -0
  215. package/dist/src/routers/payment.d.ts +80 -0
  216. package/dist/src/routers/payment.js +21 -0
  217. package/dist/src/routers/podcast.d.ts +287 -0
  218. package/dist/src/routers/podcast.js +34 -0
  219. package/dist/src/routers/studyguide.d.ts +36 -0
  220. package/dist/src/routers/studyguide.js +8 -0
  221. package/dist/src/routers/worksheets.d.ts +429 -0
  222. package/dist/src/routers/worksheets.js +139 -0
  223. package/dist/src/routers/workspace.d.ts +563 -0
  224. package/dist/src/routers/workspace.js +104 -0
  225. package/dist/src/scripts/purge-deleted-users.d.ts +1 -0
  226. package/dist/src/scripts/purge-deleted-users.js +148 -0
  227. package/dist/src/server.d.ts +1 -0
  228. package/dist/src/server.js +190 -0
  229. package/dist/src/services/activity/activity-human-description.service.d.ts +13 -0
  230. package/dist/src/services/activity/activity-human-description.service.js +221 -0
  231. package/dist/src/services/activity/activity-human-description.service.test.d.ts +1 -0
  232. package/dist/src/services/activity/activity-human-description.service.test.js +16 -0
  233. package/dist/src/services/activity/activity-log.service.d.ts +87 -0
  234. package/dist/src/services/activity/activity-log.service.js +276 -0
  235. package/dist/src/services/activity/activity-log.service.test.d.ts +1 -0
  236. package/dist/src/services/activity/activity-log.service.test.js +27 -0
  237. package/dist/src/services/admin/admin.service.d.ts +270 -0
  238. package/dist/src/services/admin/admin.service.js +476 -0
  239. package/dist/src/services/ai/ai-session.service.d.ts +5 -0
  240. package/dist/src/services/ai/ai-session.service.js +4 -0
  241. package/dist/src/services/artifacts/annotation.service.d.ts +177 -0
  242. package/dist/src/services/artifacts/annotation.service.js +154 -0
  243. package/dist/src/services/artifacts/artifact-version.service.d.ts +38 -0
  244. package/dist/src/services/artifacts/artifact-version.service.js +129 -0
  245. package/dist/src/services/artifacts/chat.service.d.ts +127 -0
  246. package/dist/src/services/artifacts/chat.service.js +182 -0
  247. package/dist/src/services/artifacts/study-guide.service.d.ts +18 -0
  248. package/dist/src/services/artifacts/study-guide.service.js +65 -0
  249. package/dist/src/services/auth/auth.service.d.ts +94 -0
  250. package/dist/src/services/auth/auth.service.js +368 -0
  251. package/dist/src/services/base.service.d.ts +14 -0
  252. package/dist/src/services/base.service.js +14 -0
  253. package/dist/src/services/billing/payment.service.d.ts +44 -0
  254. package/dist/src/services/billing/payment.service.js +365 -0
  255. package/dist/src/services/billing/subscription.service.d.ts +37 -0
  256. package/dist/src/services/billing/subscription.service.js +654 -0
  257. package/dist/src/services/billing/usage.service.d.ts +47 -0
  258. package/dist/src/services/billing/usage.service.js +149 -0
  259. package/dist/src/services/content/copilot.service.d.ts +113 -0
  260. package/dist/src/services/content/copilot.service.js +439 -0
  261. package/dist/src/services/content/flashcard-progress.service.d.ts +159 -0
  262. package/dist/src/services/content/flashcard-progress.service.js +432 -0
  263. package/dist/src/services/content/flashcard.service.d.ts +184 -0
  264. package/dist/src/services/content/flashcard.service.js +339 -0
  265. package/dist/src/services/content/media-analysis.service.d.ts +23 -0
  266. package/dist/src/services/content/media-analysis.service.js +404 -0
  267. package/dist/src/services/content/podcast.service.d.ts +267 -0
  268. package/dist/src/services/content/podcast.service.js +653 -0
  269. package/dist/src/services/content/worksheet-content.service.d.ts +37 -0
  270. package/dist/src/services/content/worksheet-content.service.js +84 -0
  271. package/dist/src/services/content/worksheet-content.service.test.d.ts +1 -0
  272. package/dist/src/services/content/worksheet-content.service.test.js +69 -0
  273. package/dist/src/services/content/worksheet-generation.service.d.ts +91 -0
  274. package/dist/src/services/content/worksheet-generation.service.js +95 -0
  275. package/dist/src/services/content/worksheet-generation.service.test.d.ts +1 -0
  276. package/dist/src/services/content/worksheet-generation.service.test.js +20 -0
  277. package/dist/src/services/content/worksheet.service.d.ts +347 -0
  278. package/dist/src/services/content/worksheet.service.js +599 -0
  279. package/dist/src/services/knowledge/knowledge-base.service.d.ts +316 -0
  280. package/dist/src/services/knowledge/knowledge-base.service.js +544 -0
  281. package/dist/src/services/members/invitation.service.d.ts +66 -0
  282. package/dist/src/services/members/invitation.service.js +348 -0
  283. package/dist/src/services/members/member.service.d.ts +36 -0
  284. package/dist/src/services/members/member.service.js +193 -0
  285. package/dist/src/services/notifications/notification.service.d.ts +214 -0
  286. package/dist/src/services/notifications/notification.service.js +550 -0
  287. package/dist/src/services/notifications/notification.service.test.d.ts +1 -0
  288. package/dist/src/services/notifications/notification.service.test.js +87 -0
  289. package/dist/src/services/workspace/workspace-analytics.service.d.ts +24 -0
  290. package/dist/src/services/workspace/workspace-analytics.service.js +95 -0
  291. package/dist/src/services/workspace/workspace-kb.service.d.ts +40 -0
  292. package/dist/src/services/workspace/workspace-kb.service.js +184 -0
  293. package/dist/src/services/workspace/workspace.service.d.ts +263 -0
  294. package/dist/src/services/workspace/workspace.service.js +401 -0
  295. package/dist/src/trpc.d.ts +60 -0
  296. package/dist/src/trpc.js +217 -0
  297. package/dist/src/types/index.d.ts +126 -0
  298. package/dist/src/types/index.js +1 -0
  299. package/dist/trpc.d.ts +12 -4
  300. package/dist/trpc.js +5 -11
  301. package/package.json +8 -9
  302. package/prisma/schema.prisma +3 -4
  303. package/prisma/seed.mjs +5 -2
  304. package/prisma.config.ts +16 -0
  305. package/src/context.ts +33 -3
  306. package/src/lib/ai/index.ts +3 -0
  307. package/src/lib/ai/llm-client.ts +23 -0
  308. package/src/lib/prisma.ts +18 -9
  309. package/src/routers/auth.ts +1 -1
  310. package/src/routers/workspace.ts +4 -0
  311. package/src/scripts/purge-deleted-users.ts +1 -3
  312. package/src/services/billing/payment.service.ts +3 -6
  313. package/src/services/billing/usage.service.ts +190 -77
  314. package/src/services/content/copilot.service.ts +23 -32
  315. package/src/services/content/flashcard-progress.service.ts +12 -9
  316. package/src/services/content/flashcard.service.ts +89 -66
  317. package/src/services/content/media-analysis.service.ts +34 -29
  318. package/src/services/content/worksheet-generation.service.test.ts +2 -2
  319. package/src/services/workspace/workspace.service.ts +73 -66
  320. package/src/trpc.ts +5 -13
  321. package/tsconfig.json +3 -0
@@ -0,0 +1,126 @@
1
+ import type { Prisma } from '@prisma/client';
2
+ /**
3
+ * Common types for the application
4
+ */
5
+ export type PrismaTransaction = Omit<Prisma.TransactionClient, '$connect' | '$disconnect' | '$on' | '$transaction' | '$use'>;
6
+ /**
7
+ * User types
8
+ */
9
+ export interface UserSession {
10
+ id: string;
11
+ name?: string | null;
12
+ email?: string | null;
13
+ image?: string | null;
14
+ }
15
+ export interface AuthContext {
16
+ session: {
17
+ user: UserSession;
18
+ } | null;
19
+ userId?: string;
20
+ }
21
+ /**
22
+ * Artifact types
23
+ */
24
+ export type ArtifactTypeEnum = 'STUDY_GUIDE' | 'FLASHCARD_SET' | 'WORKSHEET' | 'MEETING_SUMMARY' | 'PODCAST_EPISODE';
25
+ export type DifficultyEnum = 'EASY' | 'MEDIUM' | 'HARD';
26
+ export type QuestionTypeEnum = 'MULTIPLE_CHOICE' | 'TEXT' | 'NUMERIC' | 'TRUE_FALSE' | 'MATCHING' | 'FILL_IN_THE_BLANK';
27
+ /**
28
+ * Worksheet types
29
+ */
30
+ export interface MarkSchemePoint {
31
+ point: number;
32
+ requirements: number;
33
+ }
34
+ export interface MarkScheme {
35
+ points: MarkSchemePoint[];
36
+ totalPoints: number;
37
+ }
38
+ export interface UserMarkSchemePoint extends MarkSchemePoint {
39
+ achievedPoints: number;
40
+ feedback: string;
41
+ }
42
+ export interface UserMarkScheme {
43
+ points: UserMarkSchemePoint[];
44
+ totalPoints: number;
45
+ }
46
+ export interface WorksheetQuestionMeta {
47
+ options?: string[];
48
+ completed?: boolean;
49
+ userAnswer?: string;
50
+ completedAt?: Date | null;
51
+ mark_scheme?: MarkScheme;
52
+ userMarkScheme?: UserMarkScheme;
53
+ }
54
+ export interface WorksheetQuestionProgressMeta {
55
+ userMarkScheme?: UserMarkScheme;
56
+ }
57
+ export interface CreateWorksheetQuestionInput {
58
+ prompt: string;
59
+ answer?: string;
60
+ type: QuestionTypeEnum;
61
+ difficulty?: DifficultyEnum;
62
+ order?: number;
63
+ meta?: WorksheetQuestionMeta;
64
+ }
65
+ export interface UpdateWorksheetQuestionInput extends Partial<CreateWorksheetQuestionInput> {
66
+ id: string;
67
+ }
68
+ /**
69
+ * Flashcard types
70
+ */
71
+ export interface CreateFlashcardInput {
72
+ front: string;
73
+ back: string;
74
+ tags?: string[];
75
+ order?: number;
76
+ }
77
+ export interface UpdateFlashcardInput extends Partial<CreateFlashcardInput> {
78
+ id: string;
79
+ }
80
+ /**
81
+ * File upload types
82
+ */
83
+ export interface FileUploadResult {
84
+ id: string;
85
+ name: string;
86
+ url: string;
87
+ mimeType: string;
88
+ size: number;
89
+ }
90
+ /**
91
+ * Pagination types
92
+ */
93
+ export interface PaginationInput {
94
+ page?: number;
95
+ limit?: number;
96
+ }
97
+ export interface PaginatedResult<T> {
98
+ data: T[];
99
+ pagination: {
100
+ page: number;
101
+ limit: number;
102
+ total: number;
103
+ totalPages: number;
104
+ };
105
+ }
106
+ /**
107
+ * Search types
108
+ */
109
+ export interface SearchInput extends PaginationInput {
110
+ query: string;
111
+ }
112
+ /**
113
+ * Response types
114
+ */
115
+ export type SuccessResponse<T = void> = {
116
+ success: true;
117
+ data: T;
118
+ message?: string;
119
+ };
120
+ export type ErrorResponse = {
121
+ success: false;
122
+ error: {
123
+ code: string;
124
+ message: string;
125
+ };
126
+ };
@@ -0,0 +1 @@
1
+ export {};
package/dist/trpc.d.ts CHANGED
@@ -20,7 +20,9 @@ export declare const publicProcedure: import("@trpc/server").TRPCProcedureBuilde
20
20
  /** Exported procedures with middleware */
21
21
  export declare const authedProcedure: import("@trpc/server").TRPCProcedureBuilder<Context, object, {
22
22
  userId: any;
23
- session: any;
23
+ session: {
24
+ user: import("./context.js").SessionUser;
25
+ };
24
26
  req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
25
27
  res: import("express").Response<any, Record<string, any>>;
26
28
  db: import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
@@ -28,7 +30,9 @@ export declare const authedProcedure: import("@trpc/server").TRPCProcedureBuilde
28
30
  }, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, false>;
29
31
  export declare const verifiedProcedure: import("@trpc/server").TRPCProcedureBuilder<Context, object, {
30
32
  userId: any;
31
- session: any;
33
+ session: {
34
+ user: import("./context.js").SessionUser;
35
+ };
32
36
  req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
33
37
  res: import("express").Response<any, Record<string, any>>;
34
38
  db: import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
@@ -36,7 +40,9 @@ export declare const verifiedProcedure: import("@trpc/server").TRPCProcedureBuil
36
40
  }, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, false>;
37
41
  export declare const adminProcedure: import("@trpc/server").TRPCProcedureBuilder<Context, object, {
38
42
  userId: any;
39
- session: any;
43
+ session: {
44
+ user: import("./context.js").SessionUser;
45
+ };
40
46
  req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
41
47
  res: import("express").Response<any, Record<string, any>>;
42
48
  db: import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
@@ -44,7 +50,9 @@ export declare const adminProcedure: import("@trpc/server").TRPCProcedureBuilder
44
50
  }, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, import("@trpc/server").TRPCUnsetMarker, false>;
45
51
  export declare const limitedProcedure: import("@trpc/server").TRPCProcedureBuilder<Context, object, {
46
52
  userId: any;
47
- session: any;
53
+ session: {
54
+ user: import("./context.js").SessionUser;
55
+ };
48
56
  req: import("express").Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
49
57
  res: import("express").Response<any, Record<string, any>>;
50
58
  db: import("@prisma/client").PrismaClient<import("@prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
package/dist/trpc.js CHANGED
@@ -79,11 +79,8 @@ const errorHandler = middleware(async ({ next }) => {
79
79
  /**
80
80
  * Middleware that enforces email verification
81
81
  */
82
- const isVerified = middleware(async ({ ctx, next }) => {
83
- const user = await ctx.db.user.findUnique({
84
- where: { id: ctx.session.user.id },
85
- select: { emailVerified: true },
86
- });
82
+ const isVerified = middleware(({ ctx, next }) => {
83
+ const user = ctx.session?.user;
87
84
  if (!user?.emailVerified) {
88
85
  throw new TRPCError({
89
86
  code: "FORBIDDEN",
@@ -139,12 +136,9 @@ const checkUsageLimit = middleware(async ({ ctx, next, path }) => {
139
136
  /**
140
137
  * Middleware that enforces system admin role
141
138
  */
142
- const isAdmin = middleware(async ({ ctx, next }) => {
143
- const user = await ctx.db.user.findUnique({
144
- where: { id: ctx.session.user.id },
145
- include: { role: true },
146
- });
147
- if (user?.role?.name !== 'System Admin') {
139
+ const isAdmin = middleware(({ ctx, next }) => {
140
+ const user = ctx.session?.user;
141
+ if (!user?.isSystemAdmin) {
148
142
  throw new TRPCError({
149
143
  code: "FORBIDDEN",
150
144
  message: "You do not have permission to access this resource",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goscribe/server",
3
- "version": "1.5.0",
3
+ "version": "1.7.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -13,23 +13,20 @@
13
13
  },
14
14
  "scripts": {
15
15
  "dev": "tsx watch src/server.ts",
16
- "build": "npx prisma generate && tsc -p .",
16
+ "build": "prisma generate && tsc -p .",
17
17
  "start": "node --experimental-specifier-resolution=node dist/server.js",
18
18
  "test": "tsx --test \"src/**/*.test.ts\"",
19
19
  "test:activity": "tsx --test src/services/activity/activity-log.service.test.ts src/services/activity/activity-human-description.service.test.ts",
20
- "generate": "npx prisma generate",
20
+ "generate": "prisma generate",
21
21
  "prepublishOnly": "npm run generate && npm run build"
22
22
  },
23
- "prisma": {
24
- "seed": "node --experimental-specifier-resolution=node prisma/seed.mjs"
25
- },
26
23
  "author": "",
27
24
  "license": "MIT",
28
25
  "dependencies": {
29
26
  "@auth/express": "^0.11.0",
30
27
  "@auth/prisma-adapter": "^2.10.0",
31
- "@goscribe/server": "^1.1.2",
32
- "@prisma/client": "^6.14.0",
28
+ "@prisma/adapter-pg": "^7.0.0",
29
+ "@prisma/client": "^7.0.0",
33
30
  "@supabase/supabase-js": "^2.76.1",
34
31
  "@trpc/server": "^11.5.0",
35
32
  "@types/uuid": "^10.0.0",
@@ -44,7 +41,7 @@
44
41
  "morgan": "^1.10.1",
45
42
  "openai": "^6.3.0",
46
43
  "pdf-parse": "^1.1.4",
47
- "prisma": "^6.14.0",
44
+ "pg": "^8.16.0",
48
45
  "pusher": "^5.2.0",
49
46
  "pusher-js": "^8.4.0",
50
47
  "resend": "^6.9.2",
@@ -55,12 +52,14 @@
55
52
  "zod": "^4.1.1"
56
53
  },
57
54
  "devDependencies": {
55
+ "prisma": "^7.0.0",
58
56
  "@types/compression": "^1.8.1",
59
57
  "@types/cookie": "^1.0.0",
60
58
  "@types/cors": "^2.8.19",
61
59
  "@types/express": "^5.0.3",
62
60
  "@types/morgan": "^1.9.10",
63
61
  "@types/node": "^24.3.0",
62
+ "@types/pg": "^8.15.0",
64
63
  "ts-node": "^10.9.2",
65
64
  "ts-node-dev": "^2.0.0",
66
65
  "tsc-alias": "^1.8.16",
@@ -1,11 +1,10 @@
1
1
  generator client {
2
- provider = "prisma-client-js"
2
+ provider = "prisma-client"
3
+ output = "../generated/prisma"
3
4
  }
4
5
 
5
6
  datasource db {
6
- provider = "postgresql"
7
- url = env("DATABASE_URL")
8
- directUrl = env("DIRECT_URL")
7
+ provider = "postgresql"
9
8
  }
10
9
 
11
10
  //
package/prisma/seed.mjs CHANGED
@@ -1,4 +1,6 @@
1
- import { PrismaClient } from '@prisma/client';
1
+ import 'dotenv/config';
2
+ import { PrismaClient } from '../generated/prisma/client.js';
3
+ import { PrismaPg } from '@prisma/adapter-pg';
2
4
 
3
5
  /** Keep in sync with server/src/lib/curated-kb-seed.ts */
4
6
  const CURATED_KB_SEEDS = [
@@ -25,7 +27,8 @@ const CURATED_KB_SEEDS = [
25
27
  { slug: 'ib-psychology-hl', name: 'IB Psychology HL', description: 'Biological, cognitive, sociocultural, and abnormal psychology at HL depth.', category: 'IB', subject: 'psychology' },
26
28
  ];
27
29
 
28
- const prisma = new PrismaClient();
30
+ const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
31
+ const prisma = new PrismaClient({ adapter });
29
32
 
30
33
  async function main() {
31
34
  for (const seed of CURATED_KB_SEEDS) {
@@ -0,0 +1,16 @@
1
+ import "dotenv/config";
2
+ import { defineConfig, env } from "prisma/config";
3
+
4
+ // Migrations use direct connection when available (Supabase pooler vs direct).
5
+ const migrationUrl = process.env.DIRECT_URL ?? env("DATABASE_URL");
6
+
7
+ export default defineConfig({
8
+ schema: "prisma/schema.prisma",
9
+ migrations: {
10
+ path: "prisma/migrations",
11
+ seed: "node --experimental-specifier-resolution=node prisma/seed.mjs",
12
+ },
13
+ datasource: {
14
+ url: migrationUrl,
15
+ },
16
+ });
package/src/context.ts CHANGED
@@ -4,14 +4,44 @@ import { prisma } from "./lib/prisma.js";
4
4
  import { verifyCustomAuthCookie } from "./lib/auth.js";
5
5
  import cookie from "cookie";
6
6
 
7
+ export type SessionUser = {
8
+ id: string;
9
+ emailVerified: boolean;
10
+ isSystemAdmin: boolean;
11
+ };
12
+
7
13
  export async function createContext({ req, res }: CreateExpressContextOptions) {
8
14
  const cookies = cookie.parse(req.headers.cookie ?? "");
9
15
 
10
- // Only use custom auth cookie
11
16
  const custom = verifyCustomAuthCookie(cookies["auth_token"]);
12
-
17
+
13
18
  if (custom) {
14
- return { db: prisma, session: { user: { id: custom.userId } } as any, req, res, cookies };
19
+ const user = await prisma.user.findUnique({
20
+ where: { id: custom.userId },
21
+ select: {
22
+ id: true,
23
+ emailVerified: true,
24
+ role: { select: { name: true } },
25
+ },
26
+ });
27
+
28
+ if (!user) {
29
+ return { db: prisma, session: null, req, res, cookies };
30
+ }
31
+
32
+ const sessionUser: SessionUser = {
33
+ id: user.id,
34
+ emailVerified: !!user.emailVerified,
35
+ isSystemAdmin: user.role?.name === "System Admin",
36
+ };
37
+
38
+ return {
39
+ db: prisma,
40
+ session: { user: sessionUser } as { user: SessionUser },
41
+ req,
42
+ res,
43
+ cookies,
44
+ };
15
45
  }
16
46
 
17
47
  return { db: prisma, session: null, req, res, cookies };
@@ -2,6 +2,7 @@ import { aiConfig } from './config.js';
2
2
  import {
3
3
  complete,
4
4
  completeText,
5
+ streamComplete,
5
6
  } from './llm-client.js';
6
7
  import {
7
8
  DEFAULT_EMBEDDING_DIM,
@@ -21,6 +22,7 @@ export const ai = {
21
22
  llm: {
22
23
  complete,
23
24
  completeText,
25
+ streamComplete,
24
26
  },
25
27
  embed: {
26
28
  texts: embedTexts,
@@ -49,6 +51,7 @@ export {
49
51
  aiConfig,
50
52
  complete,
51
53
  completeText,
54
+ streamComplete,
52
55
  DEFAULT_EMBEDDING_DIM,
53
56
  DEFAULT_EMBEDDING_MODEL,
54
57
  embedQuery,
@@ -27,5 +27,28 @@ export async function completeText(
27
27
  return response.choices?.[0]?.message?.content ?? '';
28
28
  }
29
29
 
30
+ export async function streamComplete(
31
+ messages: ChatMessage[],
32
+ onDelta: (delta: string) => void | Promise<void>,
33
+ options: CompleteOptions = {},
34
+ ): Promise<string> {
35
+ const stream = await client.chat.completions.create({
36
+ model: options.model ?? aiConfig.llm.model,
37
+ messages,
38
+ stream: true,
39
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
40
+ });
41
+
42
+ let content = '';
43
+ for await (const chunk of stream) {
44
+ const delta = chunk.choices?.[0]?.delta?.content ?? '';
45
+ if (!delta) continue;
46
+ content += delta;
47
+ await onDelta(delta);
48
+ }
49
+
50
+ return content;
51
+ }
52
+
30
53
  /** @deprecated Use `complete()` from the ai module instead. */
31
54
  export default complete;
package/src/lib/prisma.ts CHANGED
@@ -1,16 +1,25 @@
1
- // Resolve the client from this package's generated output so types always match
2
- // `prisma/schema.prisma` (the `@prisma/client` entry can resolve to a different
3
- // generated client in multi-folder workspaces and lose model delegates in the IDE).
4
- import { PrismaClient } from "../../node_modules/.prisma/client/index.js";
1
+ import { PrismaPg } from "@prisma/adapter-pg";
2
+ import { PrismaClient } from "../../generated/prisma/client.js";
5
3
 
6
- export { ArtifactType } from "../../node_modules/.prisma/client/index.js";
4
+ export {
5
+ ArtifactType,
6
+ ActivityLogCategory,
7
+ ActivityLogStatus,
8
+ InvoiceType,
9
+ } from "../../generated/prisma/client.js";
7
10
 
8
11
  const globalForPrisma = globalThis as unknown as { prisma?: PrismaClient };
9
12
 
13
+ function createPrismaClient(): PrismaClient {
14
+ const connectionString = process.env.DATABASE_URL;
15
+ if (!connectionString) {
16
+ throw new Error("DATABASE_URL is not set");
17
+ }
18
+ const adapter = new PrismaPg({ connectionString });
19
+ return new PrismaClient({ adapter });
20
+ }
21
+
10
22
  export const prisma =
11
- globalForPrisma.prisma ??
12
- new PrismaClient({
13
- // log: ["query"], // enable if you want
14
- });
23
+ globalForPrisma.prisma ?? createPrismaClient();
15
24
 
16
25
  if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
@@ -30,7 +30,7 @@ const passwordFieldSchema = z
30
30
  .regex(/[^a-zA-Z0-9]/, 'Password must contain at least one special character');
31
31
 
32
32
  export const auth = router({
33
- updateProfile: publicProcedure
33
+ updateProfile: authedProcedure
34
34
  .input(z.object({ name: z.string().min(1) }))
35
35
  .mutation(({ ctx, input }) =>
36
36
  new AuthService(ctx.db).updateProfile(ctx.session.user.id, input),
@@ -71,6 +71,10 @@ export const workspace = router({
71
71
  new WorkspaceService(ctx.db).getStats(ctx.session.user.id),
72
72
  ),
73
73
 
74
+ getAccountSummary: authedProcedure.query(({ ctx }) =>
75
+ new WorkspaceService(ctx.db).getAccountSummary(ctx.session.user.id),
76
+ ),
77
+
74
78
  getStudyAnalytics: authedProcedure.query(({ ctx }) =>
75
79
  new WorkspaceAnalyticsService(ctx.db).getStudyAnalytics(ctx.session.user.id),
76
80
  ),
@@ -1,4 +1,4 @@
1
- import { PrismaClient } from '@prisma/client';
1
+ import { prisma as db } from '../lib/prisma.js';
2
2
  import { supabaseClient } from '../lib/storage.js';
3
3
  import { logger } from '../lib/logger.js';
4
4
  import { env } from '../lib/env.js';
@@ -9,8 +9,6 @@ import {
9
9
  } from '@prisma/client';
10
10
  import { recordExplicitActivity } from '../services/activity/activity-log.service.js';
11
11
 
12
- const db = new PrismaClient();
13
-
14
12
  async function purgeDeletedUsers() {
15
13
  try {
16
14
  const startedAt = Date.now();
@@ -5,7 +5,7 @@ import { Stripe } from 'stripe';
5
5
  import { BaseService } from '../base.service.js';
6
6
  import { stripe } from '../../lib/stripe.js';
7
7
  import { env } from '../../lib/env.js';
8
- import { getUserUsage, getUserPlanLimits } from './usage.service.js';
8
+ import { getAccountSummary, getUserUsage, getUserPlanLimits } from './usage.service.js';
9
9
  import {
10
10
  notifyPaymentSucceeded,
11
11
  notifySubscriptionActivated,
@@ -423,11 +423,8 @@ export class PaymentService extends BaseService {
423
423
  }
424
424
 
425
425
  async getUsageOverview(userId: string) {
426
- const [usage, limits] = await Promise.all([
427
- getUserUsage(userId),
428
- getUserPlanLimits(userId),
429
- ]);
430
- return { usage, limits, hasActivePlan: !!limits };
426
+ const { usage, limits, hasActivePlan } = await getAccountSummary(userId);
427
+ return { usage, limits, hasActivePlan };
431
428
  }
432
429
 
433
430
  getResourcePrices() {