wrong-notebook 2026.10.22-4 → 2026.10.23

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 (688) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +0 -1
  3. package/.next/build-manifest.json +8 -8
  4. package/.next/prerender-manifest.json +4 -4
  5. package/.next/routes-manifest.json +0 -8
  6. package/.next/server/app/_global-error/page/build-manifest.json +5 -5
  7. package/.next/server/app/_global-error/page.js +2 -2
  8. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/_global-error.html +1 -1
  11. package/.next/server/app/_global-error.rsc +8 -8
  12. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +7 -7
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
  14. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/server/app/_not-found/page/build-manifest.json +5 -5
  16. package/.next/server/app/_not-found/page.js +2 -2
  17. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/admin/page/build-manifest.json +5 -5
  20. package/.next/server/app/admin/page.js +2 -2
  21. package/.next/server/app/admin/page.js.nft.json +1 -1
  22. package/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  23. package/.next/server/app/admin/user/[id]/page/build-manifest.json +5 -5
  24. package/.next/server/app/admin/user/[id]/page.js +2 -2
  25. package/.next/server/app/admin/user/[id]/page.js.nft.json +1 -1
  26. package/.next/server/app/admin/user/[id]/page_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/admin/dashboard/route.js +10 -4
  28. package/.next/server/app/api/admin/dashboard/route.js.nft.json +1 -1
  29. package/.next/server/app/api/admin/migrate-tags/route.js +3 -3
  30. package/.next/server/app/api/admin/migrate-tags/route.js.nft.json +1 -1
  31. package/.next/server/app/api/admin/system-reset/route.js +4 -4
  32. package/.next/server/app/api/admin/system-reset/route.js.nft.json +1 -1
  33. package/.next/server/app/api/admin/users/[id]/detail/route.js +11 -4
  34. package/.next/server/app/api/admin/users/[id]/detail/route.js.nft.json +1 -1
  35. package/.next/server/app/api/admin/users/[id]/route.js +3 -3
  36. package/.next/server/app/api/admin/users/[id]/route.js.nft.json +1 -1
  37. package/.next/server/app/api/admin/users/route.js +3 -3
  38. package/.next/server/app/api/admin/users/route.js.nft.json +1 -1
  39. package/.next/server/app/api/ai/models/route.js +7 -7
  40. package/.next/server/app/api/ai/models/route.js.nft.json +1 -1
  41. package/.next/server/app/api/ai/test/route.js +8 -8
  42. package/.next/server/app/api/ai/test/route.js.nft.json +1 -1
  43. package/.next/server/app/api/analytics/route.js +5 -5
  44. package/.next/server/app/api/analytics/route.js.nft.json +1 -1
  45. package/.next/server/app/api/analyze/route.js +9 -9
  46. package/.next/server/app/api/analyze/route.js.nft.json +1 -1
  47. package/.next/server/app/api/auth/[...nextauth]/route.js +3 -3
  48. package/.next/server/app/api/auth/[...nextauth]/route.js.nft.json +1 -1
  49. package/.next/server/app/api/error-items/[id]/delete/route.js +4 -4
  50. package/.next/server/app/api/error-items/[id]/delete/route.js.nft.json +1 -1
  51. package/.next/server/app/api/error-items/[id]/figure/route.js +8 -8
  52. package/.next/server/app/api/error-items/[id]/figure/route.js.nft.json +1 -1
  53. package/.next/server/app/api/error-items/[id]/fix-latex/route.js +9 -9
  54. package/.next/server/app/api/error-items/[id]/fix-latex/route.js.nft.json +1 -1
  55. package/.next/server/app/api/error-items/[id]/geogebra/route.js +7 -7
  56. package/.next/server/app/api/error-items/[id]/geogebra/route.js.nft.json +1 -1
  57. package/.next/server/app/api/error-items/[id]/image/route.js +4 -4
  58. package/.next/server/app/api/error-items/[id]/image/route.js.nft.json +1 -1
  59. package/.next/server/app/api/error-items/[id]/notes/route.js +4 -4
  60. package/.next/server/app/api/error-items/[id]/notes/route.js.nft.json +1 -1
  61. package/.next/server/app/api/error-items/[id]/practice-records/route.js +4 -4
  62. package/.next/server/app/api/error-items/[id]/practice-records/route.js.nft.json +1 -1
  63. package/.next/server/app/api/error-items/[id]/reanswer/route.js +10 -10
  64. package/.next/server/app/api/error-items/[id]/reanswer/route.js.nft.json +1 -1
  65. package/.next/server/app/api/error-items/[id]/retag/route.js +8 -8
  66. package/.next/server/app/api/error-items/[id]/retag/route.js.nft.json +1 -1
  67. package/.next/server/app/api/error-items/[id]/route.js +1 -1
  68. package/.next/server/app/api/error-items/[id]/route.js.nft.json +1 -1
  69. package/.next/server/app/api/error-items/[id]/svg-animation/route.js +10 -10
  70. package/.next/server/app/api/error-items/[id]/svg-animation/route.js.nft.json +1 -1
  71. package/.next/server/app/api/error-items/batch-delete/route.js +4 -4
  72. package/.next/server/app/api/error-items/batch-delete/route.js.nft.json +1 -1
  73. package/.next/server/app/api/error-items/clear/route.js +4 -4
  74. package/.next/server/app/api/error-items/clear/route.js.nft.json +1 -1
  75. package/.next/server/app/api/error-items/list/route.js +6 -6
  76. package/.next/server/app/api/error-items/list/route.js.nft.json +1 -1
  77. package/.next/server/app/api/error-items/route.js +10 -10
  78. package/.next/server/app/api/error-items/route.js.nft.json +1 -1
  79. package/.next/server/app/api/error-items/short/[shortId]/route.js +3 -3
  80. package/.next/server/app/api/error-items/short/[shortId]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/error-items/similarity/route.js +4 -4
  82. package/.next/server/app/api/error-items/similarity/route.js.nft.json +1 -1
  83. package/.next/server/app/api/exams/[id]/questions/[questionId]/regenerate/route.js +9 -9
  84. package/.next/server/app/api/exams/[id]/questions/[questionId]/regenerate/route.js.nft.json +1 -1
  85. package/.next/server/app/api/exams/[id]/results/route.js +7 -7
  86. package/.next/server/app/api/exams/[id]/results/route.js.nft.json +1 -1
  87. package/.next/server/app/api/exams/[id]/retry/route.js +9 -9
  88. package/.next/server/app/api/exams/[id]/retry/route.js.nft.json +1 -1
  89. package/.next/server/app/api/exams/[id]/route.js +7 -7
  90. package/.next/server/app/api/exams/[id]/route.js.nft.json +1 -1
  91. package/.next/server/app/api/exams/route.js +9 -9
  92. package/.next/server/app/api/exams/route.js.nft.json +1 -1
  93. package/.next/server/app/api/export/route.js +4 -4
  94. package/.next/server/app/api/export/route.js.nft.json +1 -1
  95. package/.next/server/app/api/geogebra-analyze/route.js +7 -7
  96. package/.next/server/app/api/geogebra-analyze/route.js.nft.json +1 -1
  97. package/.next/server/app/api/health/route.js +2 -2
  98. package/.next/server/app/api/health/route.js.nft.json +1 -1
  99. package/.next/server/app/api/import/route.js +9 -9
  100. package/.next/server/app/api/import/route.js.nft.json +1 -1
  101. package/.next/server/app/api/logs/frontend/route.js +4 -4
  102. package/.next/server/app/api/logs/frontend/route.js.nft.json +1 -1
  103. package/.next/server/app/api/notebooks/[id]/retag/route.js +5 -5
  104. package/.next/server/app/api/notebooks/[id]/retag/route.js.nft.json +1 -1
  105. package/.next/server/app/api/notebooks/[id]/route.js +4 -4
  106. package/.next/server/app/api/notebooks/[id]/route.js.nft.json +1 -1
  107. package/.next/server/app/api/notebooks/route.js +3 -3
  108. package/.next/server/app/api/notebooks/route.js.nft.json +1 -1
  109. package/.next/server/app/api/openclaw/batch-upload/route.js +9 -9
  110. package/.next/server/app/api/openclaw/batch-upload/route.js.nft.json +1 -1
  111. package/.next/server/app/api/practice/generate/route.js +7 -7
  112. package/.next/server/app/api/practice/generate/route.js.nft.json +1 -1
  113. package/.next/server/app/api/practice/record/[id]/route.js +7 -7
  114. package/.next/server/app/api/practice/record/[id]/route.js.nft.json +1 -1
  115. package/.next/server/app/api/practice/record/route.js +9 -9
  116. package/.next/server/app/api/practice/record/route.js.nft.json +1 -1
  117. package/.next/server/app/api/reanswer/route.js +9 -9
  118. package/.next/server/app/api/reanswer/route.js.nft.json +1 -1
  119. package/.next/server/app/api/register/route.js.nft.json +1 -1
  120. package/.next/server/app/api/register/status/route.js +2 -2
  121. package/.next/server/app/api/register/status/route.js.nft.json +1 -1
  122. package/.next/server/app/api/settings/route.js +5 -5
  123. package/.next/server/app/api/settings/route.js.nft.json +1 -1
  124. package/.next/server/app/api/stats/practice/clear/route.js +4 -4
  125. package/.next/server/app/api/stats/practice/clear/route.js.nft.json +1 -1
  126. package/.next/server/app/api/stats/practice/route.js +3 -3
  127. package/.next/server/app/api/stats/practice/route.js.nft.json +1 -1
  128. package/.next/server/app/api/tags/route.js +4 -4
  129. package/.next/server/app/api/tags/route.js.nft.json +1 -1
  130. package/.next/server/app/api/tags/stats/route.js +4 -4
  131. package/.next/server/app/api/tags/stats/route.js.nft.json +1 -1
  132. package/.next/server/app/api/tags/suggestions/route.js +3 -3
  133. package/.next/server/app/api/tags/suggestions/route.js.nft.json +1 -1
  134. package/.next/server/app/api/tasks/route.js +4 -4
  135. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  136. package/.next/server/app/api/user/route.js +4 -4
  137. package/.next/server/app/api/user/route.js.nft.json +1 -1
  138. package/.next/server/app/api/version/route.js +2 -2
  139. package/.next/server/app/api/version/route.js.nft.json +1 -1
  140. package/.next/server/app/error-items/[id]/page/build-manifest.json +5 -5
  141. package/.next/server/app/error-items/[id]/page.js +2 -2
  142. package/.next/server/app/error-items/[id]/page.js.nft.json +1 -1
  143. package/.next/server/app/error-items/[id]/page_client-reference-manifest.js +1 -1
  144. package/.next/server/app/exams/[id]/page/build-manifest.json +5 -5
  145. package/.next/server/app/exams/[id]/page.js +2 -2
  146. package/.next/server/app/exams/[id]/page.js.nft.json +1 -1
  147. package/.next/server/app/exams/[id]/page_client-reference-manifest.js +1 -1
  148. package/.next/server/app/exams/[id]/print/page/build-manifest.json +5 -5
  149. package/.next/server/app/exams/[id]/print/page.js +2 -2
  150. package/.next/server/app/exams/[id]/print/page.js.nft.json +1 -1
  151. package/.next/server/app/exams/[id]/print/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/exams/page/build-manifest.json +5 -5
  153. package/.next/server/app/exams/page.js +2 -2
  154. package/.next/server/app/exams/page.js.nft.json +1 -1
  155. package/.next/server/app/exams/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/favicon.ico/route.js +2 -2
  157. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  158. package/.next/server/app/latex-test/page/build-manifest.json +5 -5
  159. package/.next/server/app/latex-test/page.js +2 -2
  160. package/.next/server/app/latex-test/page.js.nft.json +1 -1
  161. package/.next/server/app/latex-test/page_client-reference-manifest.js +1 -1
  162. package/.next/server/app/login/page/build-manifest.json +5 -5
  163. package/.next/server/app/login/page.js +2 -2
  164. package/.next/server/app/login/page.js.nft.json +1 -1
  165. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  166. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  167. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  168. package/.next/server/app/notebooks/[id]/add/page/build-manifest.json +5 -5
  169. package/.next/server/app/notebooks/[id]/add/page.js +2 -2
  170. package/.next/server/app/notebooks/[id]/add/page.js.nft.json +1 -1
  171. package/.next/server/app/notebooks/[id]/add/page_client-reference-manifest.js +1 -1
  172. package/.next/server/app/notebooks/[id]/page/build-manifest.json +5 -5
  173. package/.next/server/app/notebooks/[id]/page.js +2 -2
  174. package/.next/server/app/notebooks/[id]/page.js.nft.json +1 -1
  175. package/.next/server/app/notebooks/[id]/page_client-reference-manifest.js +1 -1
  176. package/.next/server/app/notebooks/page/build-manifest.json +5 -5
  177. package/.next/server/app/notebooks/page.js +2 -2
  178. package/.next/server/app/notebooks/page.js.nft.json +1 -1
  179. package/.next/server/app/notebooks/page_client-reference-manifest.js +1 -1
  180. package/.next/server/app/page/build-manifest.json +5 -5
  181. package/.next/server/app/page.js +2 -2
  182. package/.next/server/app/page.js.nft.json +1 -1
  183. package/.next/server/app/page_client-reference-manifest.js +1 -1
  184. package/.next/server/app/practice/page/build-manifest.json +5 -5
  185. package/.next/server/app/practice/page.js +2 -2
  186. package/.next/server/app/practice/page.js.nft.json +1 -1
  187. package/.next/server/app/practice/page_client-reference-manifest.js +1 -1
  188. package/.next/server/app/print-preview/page/build-manifest.json +5 -5
  189. package/.next/server/app/print-preview/page.js +2 -2
  190. package/.next/server/app/print-preview/page.js.nft.json +1 -1
  191. package/.next/server/app/print-preview/page_client-reference-manifest.js +1 -1
  192. package/.next/server/app/register/page/build-manifest.json +5 -5
  193. package/.next/server/app/register/page.js.nft.json +1 -1
  194. package/.next/server/app/register/page_client-reference-manifest.js +1 -1
  195. package/.next/server/app/stats/page/build-manifest.json +5 -5
  196. package/.next/server/app/stats/page.js +2 -2
  197. package/.next/server/app/stats/page.js.nft.json +1 -1
  198. package/.next/server/app/stats/page_client-reference-manifest.js +1 -1
  199. package/.next/server/app/tags/page/build-manifest.json +5 -5
  200. package/.next/server/app/tags/page.js +2 -2
  201. package/.next/server/app/tags/page.js.nft.json +1 -1
  202. package/.next/server/app/tags/page_client-reference-manifest.js +1 -1
  203. package/.next/server/app-paths-manifest.json +0 -1
  204. package/.next/server/chunks/1jng_app_api_exams_[id]_questions_[questionId]_regenerate_route_actions_1ggead3.js +1 -1
  205. package/.next/server/chunks/1oeh_server_app_api_error-items_[id]_practice-records_route_actions_0z2zuf1.js +1 -1
  206. package/.next/server/chunks/1oeh_server_app_api_error-items_[id]_svg-animation_route_actions_17gckf3.js +1 -1
  207. package/.next/server/chunks/[externals]__04n7qbr._.js +1 -1
  208. package/.next/server/chunks/[externals]__0jzwjtl._.js +3 -0
  209. package/.next/server/chunks/[externals]__0pot68n._.js +1 -1
  210. package/.next/server/chunks/[externals]_assert_1pwe1ri._.js +1 -1
  211. package/.next/server/chunks/[root-of-the-server]__0-2l_pu._.js +3 -0
  212. package/.next/server/chunks/[root-of-the-server]__00_hq9v._.js +6 -6
  213. package/.next/server/chunks/[root-of-the-server]__00moo9h._.js +3 -0
  214. package/.next/server/chunks/[root-of-the-server]__012xcq-._.js +3 -0
  215. package/.next/server/chunks/[root-of-the-server]__01bzczj._.js +1 -1
  216. package/.next/server/chunks/[root-of-the-server]__02pqrw_._.js +3 -0
  217. package/.next/server/chunks/[root-of-the-server]__033ri9p._.js +3 -0
  218. package/.next/server/chunks/[root-of-the-server]__04pjde6._.js +3 -0
  219. package/.next/server/chunks/[root-of-the-server]__064krqp._.js +3 -0
  220. package/.next/server/chunks/[root-of-the-server]__07iraov._.js +3 -0
  221. package/.next/server/chunks/[root-of-the-server]__07jl92a._.js +1 -1
  222. package/.next/server/chunks/[root-of-the-server]__07q7nsp._.js +3 -0
  223. package/.next/server/chunks/[root-of-the-server]__0_t7bbz._.js +1 -1
  224. package/.next/server/chunks/[root-of-the-server]__0_unb90._.js +3 -0
  225. package/.next/server/chunks/[root-of-the-server]__0a1zwxf._.js +3 -0
  226. package/.next/server/chunks/[root-of-the-server]__0aefi10._.js +3 -0
  227. package/.next/server/chunks/[root-of-the-server]__0akadps._.js +1 -1
  228. package/.next/server/chunks/[root-of-the-server]__0cfjgye._.js +3 -0
  229. package/.next/server/chunks/[root-of-the-server]__0d-37yj._.js +3 -0
  230. package/.next/server/chunks/[root-of-the-server]__0d2kpnm._.js +3 -0
  231. package/.next/server/chunks/[root-of-the-server]__0dqgi36._.js +3 -0
  232. package/.next/server/chunks/[root-of-the-server]__0dz5c04._.js +3 -0
  233. package/.next/server/chunks/[root-of-the-server]__0e_u82_._.js +3 -0
  234. package/.next/server/chunks/[root-of-the-server]__0f3jyg0._.js +3 -0
  235. package/.next/server/chunks/[root-of-the-server]__0gwwa9b._.js +3 -0
  236. package/.next/server/chunks/[root-of-the-server]__0hars8c._.js +3 -0
  237. package/.next/server/chunks/[root-of-the-server]__0iozebm._.js +3 -0
  238. package/.next/server/chunks/[root-of-the-server]__0k-5uu2._.js +3 -0
  239. package/.next/server/chunks/[root-of-the-server]__0k3mm05._.js +3 -0
  240. package/.next/server/chunks/[root-of-the-server]__0l-xu_t._.js +3 -0
  241. package/.next/server/chunks/[root-of-the-server]__0lggrcf._.js +3 -0
  242. package/.next/server/chunks/[root-of-the-server]__0m0eall._.js +3 -0
  243. package/.next/server/chunks/[root-of-the-server]__0m37xyb._.js +3 -0
  244. package/.next/server/chunks/[root-of-the-server]__0m8p-6f._.js +1 -1
  245. package/.next/server/chunks/[root-of-the-server]__0pa47kn._.js +3 -0
  246. package/.next/server/chunks/[root-of-the-server]__0r42_o7._.js +3 -0
  247. package/.next/server/chunks/[root-of-the-server]__0rgjh3q._.js +3 -0
  248. package/.next/server/chunks/[root-of-the-server]__0rk_yxy._.js +3 -3
  249. package/.next/server/chunks/[root-of-the-server]__0scij0p._.js +3 -0
  250. package/.next/server/chunks/[root-of-the-server]__0sixhu9._.js +3 -0
  251. package/.next/server/chunks/[root-of-the-server]__0sj18kk._.js +3 -0
  252. package/.next/server/chunks/[root-of-the-server]__0sp4_zo._.js +3 -0
  253. package/.next/server/chunks/[root-of-the-server]__0t2o8v-._.js +3 -0
  254. package/.next/server/chunks/[root-of-the-server]__0w58v6b._.js +3 -0
  255. package/.next/server/chunks/[root-of-the-server]__0wp40ty._.js +3 -0
  256. package/.next/server/chunks/[root-of-the-server]__0wsj4a_._.js +3 -0
  257. package/.next/server/chunks/[root-of-the-server]__0wvvsah._.js +3 -0
  258. package/.next/server/chunks/[root-of-the-server]__0xg5h56._.js +3 -0
  259. package/.next/server/chunks/[root-of-the-server]__0zpazf3._.js +3 -0
  260. package/.next/server/chunks/[root-of-the-server]__10hs-qn._.js +3 -0
  261. package/.next/server/chunks/[root-of-the-server]__119xork._.js +3 -0
  262. package/.next/server/chunks/[root-of-the-server]__11_-ncy._.js +1 -1
  263. package/.next/server/chunks/[root-of-the-server]__11jhplo._.js +3 -0
  264. package/.next/server/chunks/[root-of-the-server]__122xu-0._.js +9 -9
  265. package/.next/server/chunks/[root-of-the-server]__15tkoe6._.js +1 -1
  266. package/.next/server/chunks/[root-of-the-server]__15y1l96._.js +3 -0
  267. package/.next/server/chunks/[root-of-the-server]__16hnc6-._.js +3 -0
  268. package/.next/server/chunks/[root-of-the-server]__17i9sje._.js +3 -0
  269. package/.next/server/chunks/[root-of-the-server]__19_wn9u._.js +3 -0
  270. package/.next/server/chunks/[root-of-the-server]__1_gkx5x._.js +1 -1
  271. package/.next/server/chunks/[root-of-the-server]__1_hp3ol._.js +3 -0
  272. package/.next/server/chunks/[root-of-the-server]__1_ogacf._.js +3 -0
  273. package/.next/server/chunks/[root-of-the-server]__1a4-26x._.js +3 -0
  274. package/.next/server/chunks/[root-of-the-server]__1b6i9mu._.js +3 -0
  275. package/.next/server/chunks/[root-of-the-server]__1b_y2wk._.js +3 -0
  276. package/.next/server/chunks/[root-of-the-server]__1bl7t8i._.js +3 -0
  277. package/.next/server/chunks/[root-of-the-server]__1c0vatt._.js +3 -0
  278. package/.next/server/chunks/[root-of-the-server]__1c7a0rs._.js +3 -0
  279. package/.next/server/chunks/[root-of-the-server]__1chx4lo._.js +3 -0
  280. package/.next/server/chunks/[root-of-the-server]__1cngnud._.js +3 -0
  281. package/.next/server/chunks/[root-of-the-server]__1d82zkk._.js +3 -0
  282. package/.next/server/chunks/[root-of-the-server]__1ezju_2._.js +3 -0
  283. package/.next/server/chunks/[root-of-the-server]__1fc23i5._.js +122 -0
  284. package/.next/server/chunks/[root-of-the-server]__1flnfu4._.js +3 -0
  285. package/.next/server/chunks/[root-of-the-server]__1gya7jq._.js +3 -0
  286. package/.next/server/chunks/[root-of-the-server]__1hng_h2._.js +3 -0
  287. package/.next/server/chunks/[root-of-the-server]__1i40psm._.js +3 -0
  288. package/.next/server/chunks/[root-of-the-server]__1ijkds_._.js +3 -0
  289. package/.next/server/chunks/[root-of-the-server]__1j4v2e3._.js +3 -0
  290. package/.next/server/chunks/[root-of-the-server]__1jtd2ar._.js +2 -2
  291. package/.next/server/chunks/[root-of-the-server]__1kpo44g._.js +1 -1
  292. package/.next/server/chunks/[root-of-the-server]__1lbcdia._.js +3 -0
  293. package/.next/server/chunks/[root-of-the-server]__1m86czr._.js +3 -0
  294. package/.next/server/chunks/[root-of-the-server]__1mnpqkx._.js +3 -0
  295. package/.next/server/chunks/[root-of-the-server]__1n4b6nb._.js +3 -0
  296. package/.next/server/chunks/[root-of-the-server]__1nmrlew._.js +3 -0
  297. package/.next/server/chunks/[root-of-the-server]__1nmtv65._.js +1 -1
  298. package/.next/server/chunks/[root-of-the-server]__1o34kp3._.js +3 -0
  299. package/.next/server/chunks/[root-of-the-server]__1q7yl7l._.js +3 -0
  300. package/.next/server/chunks/[root-of-the-server]__1qv60vg._.js +3 -0
  301. package/.next/server/chunks/[root-of-the-server]__1ry8uat._.js +3 -0
  302. package/.next/server/chunks/[root-of-the-server]__1s2rww3._.js +3 -0
  303. package/.next/server/chunks/[root-of-the-server]__1svvf40._.js +3 -0
  304. package/.next/server/chunks/[root-of-the-server]__1tk0-4v._.js +3 -0
  305. package/.next/server/chunks/[root-of-the-server]__1v-71me._.js +3 -0
  306. package/.next/server/chunks/[root-of-the-server]__1vw740y._.js +9 -9
  307. package/.next/server/chunks/[root-of-the-server]__1x_ud_-._.js +3 -0
  308. package/.next/server/chunks/[root-of-the-server]__1yt_xxr._.js +3 -0
  309. package/.next/server/chunks/_0-eguqv._.js +1 -1
  310. package/.next/server/chunks/_008zx49._.js +1 -1
  311. package/.next/server/chunks/_011-ll5._.js +1 -1
  312. package/.next/server/chunks/_0389uce._.js +1 -1
  313. package/.next/server/chunks/_0431fxn._.js +1 -1
  314. package/.next/server/chunks/_0ekrwj-._.js +6 -6
  315. package/.next/server/chunks/_0gwg6ba._.js +1 -1
  316. package/.next/server/chunks/_0gxi3zr._.js +1 -1
  317. package/.next/server/chunks/_0lz3t4l._.js +2 -2
  318. package/.next/server/chunks/_0n36ev0._.js +3 -0
  319. package/.next/server/chunks/_0oc8oe4._.js +3 -0
  320. package/.next/server/chunks/_0rjzgi0._.js +3 -0
  321. package/.next/server/chunks/_0uxp3uh._.js +1 -1
  322. package/.next/server/chunks/_0x3ltk0._.js +6 -6
  323. package/.next/server/chunks/_10y361h._.js +3 -0
  324. package/.next/server/chunks/_12w5k19._.js +1 -1
  325. package/.next/server/chunks/_13ffmxv._.js +1 -1
  326. package/.next/server/chunks/_14tz_k9._.js +1 -1
  327. package/.next/server/chunks/_15neond._.js +11 -0
  328. package/.next/server/chunks/_16jdov0._.js +1 -1
  329. package/.next/server/chunks/_18amra5._.js +1 -1
  330. package/.next/server/chunks/_1_ns7o3._.js +1 -1
  331. package/.next/server/chunks/_1a1aqmi._.js +1 -1
  332. package/.next/server/chunks/_1a1udq0._.js +1 -1
  333. package/.next/server/chunks/_1b0269x._.js +1 -1
  334. package/.next/server/chunks/_1b7qjlv._.js +1 -1
  335. package/.next/server/chunks/_1be-y66._.js +1 -1
  336. package/.next/server/chunks/_1ex6ovo._.js +1 -1
  337. package/.next/server/chunks/_1fgb9ve._.js +1 -1
  338. package/.next/server/chunks/_1m-yyz-._.js +1 -1
  339. package/.next/server/chunks/_1n1xsqj._.js +3 -0
  340. package/.next/server/chunks/_1oj6gy_._.js +1 -1
  341. package/.next/server/chunks/_1pvqo-q._.js +1 -1
  342. package/.next/server/chunks/_1z_ujac._.js +1 -1
  343. package/.next/server/chunks/_211va-d._.js +1 -1
  344. package/.next/server/chunks/_2194yr7._.js +11 -0
  345. package/.next/server/chunks/_next-internal_server_app_api_admin_dashboard_route_actions_1ispso-.js +1 -1
  346. package/.next/server/chunks/_next-internal_server_app_api_admin_users_[id]_detail_route_actions_0oe_wkt.js +1 -1
  347. package/.next/server/chunks/_next-internal_server_app_api_admin_users_route_actions_0q-rtz1.js +1 -1
  348. package/.next/server/chunks/_next-internal_server_app_api_ai_models_route_actions_0w7iwv-.js +1 -1
  349. package/.next/server/chunks/_next-internal_server_app_api_ai_test_route_actions_1p0n1q8.js +1 -1
  350. package/.next/server/chunks/_next-internal_server_app_api_analytics_route_actions_1e0ou17.js +1 -1
  351. package/.next/server/chunks/_next-internal_server_app_api_analyze_route_actions_0lx-23h.js +1 -1
  352. package/.next/server/chunks/_next-internal_server_app_api_auth_[___nextauth]_route_actions_08nexdk.js +1 -1
  353. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_figure_route_actions_0adlts0.js +1 -1
  354. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_fix-latex_route_actions_0hc7dhx.js +1 -1
  355. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_geogebra_route_actions_1-ks4uv.js +1 -1
  356. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_image_route_actions_1k9n5yl.js +1 -1
  357. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_reanswer_route_actions_1-sw0j2.js +1 -1
  358. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_retag_route_actions_0ckki4n.js +1 -1
  359. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_route_actions_1kbs4ux.js +1 -1
  360. package/.next/server/chunks/_next-internal_server_app_api_error-items_batch-delete_route_actions_0hiq_1k.js +1 -1
  361. package/.next/server/chunks/_next-internal_server_app_api_error-items_clear_route_actions_14t_6i-.js +1 -1
  362. package/.next/server/chunks/_next-internal_server_app_api_error-items_list_route_actions_032x4ue.js +1 -1
  363. package/.next/server/chunks/_next-internal_server_app_api_error-items_route_actions_1zdvz0p.js +1 -1
  364. package/.next/server/chunks/_next-internal_server_app_api_error-items_similarity_route_actions_1i26if9.js +1 -1
  365. package/.next/server/chunks/_next-internal_server_app_api_exams_[id]_retry_route_actions_1fdi39f.js +1 -1
  366. package/.next/server/chunks/_next-internal_server_app_api_exams_[id]_route_actions_1wuidrq.js +1 -1
  367. package/.next/server/chunks/_next-internal_server_app_api_exams_route_actions_1c_zhtj.js +1 -1
  368. package/.next/server/chunks/_next-internal_server_app_api_export_route_actions_0lpcnjc.js +1 -1
  369. package/.next/server/chunks/_next-internal_server_app_api_geogebra-analyze_route_actions_1xng0_c.js +1 -1
  370. package/.next/server/chunks/_next-internal_server_app_api_health_route_actions_1ryftkb.js +1 -1
  371. package/.next/server/chunks/_next-internal_server_app_api_import_route_actions_20ko04x.js +1 -1
  372. package/.next/server/chunks/_next-internal_server_app_api_logs_frontend_route_actions_0nxepty.js +1 -1
  373. package/.next/server/chunks/_next-internal_server_app_api_notebooks_[id]_retag_route_actions_00su_t8.js +1 -1
  374. package/.next/server/chunks/_next-internal_server_app_api_notebooks_[id]_route_actions_11j3vxg.js +1 -1
  375. package/.next/server/chunks/_next-internal_server_app_api_notebooks_route_actions_02cy45r.js +1 -1
  376. package/.next/server/chunks/_next-internal_server_app_api_openclaw_batch-upload_route_actions_1zz3oen.js +1 -1
  377. package/.next/server/chunks/_next-internal_server_app_api_practice_generate_route_actions_1krr9n_.js +1 -1
  378. package/.next/server/chunks/_next-internal_server_app_api_practice_record_[id]_route_actions_0zreiom.js +1 -1
  379. package/.next/server/chunks/_next-internal_server_app_api_practice_record_route_actions_0py9z__.js +1 -1
  380. package/.next/server/chunks/_next-internal_server_app_api_reanswer_route_actions_04xweh_.js +1 -1
  381. package/.next/server/chunks/_next-internal_server_app_api_register_route_actions_0vlzh_c.js +1 -1
  382. package/.next/server/chunks/_next-internal_server_app_api_register_status_route_actions_0b52_sj.js +1 -1
  383. package/.next/server/chunks/_next-internal_server_app_api_settings_route_actions_1bpm9ac.js +1 -1
  384. package/.next/server/chunks/_next-internal_server_app_api_stats_practice_clear_route_actions_1iz6iz0.js +1 -1
  385. package/.next/server/chunks/_next-internal_server_app_api_stats_practice_route_actions_1tfoxx-.js +1 -1
  386. package/.next/server/chunks/_next-internal_server_app_api_tags_route_actions_1nb9ma2.js +1 -1
  387. package/.next/server/chunks/_next-internal_server_app_api_tags_stats_route_actions_0fmeadc.js +1 -1
  388. package/.next/server/chunks/_next-internal_server_app_api_tags_suggestions_route_actions_1xpolyv.js +1 -1
  389. package/.next/server/chunks/_next-internal_server_app_api_tasks_route_actions_123tq1_.js +1 -1
  390. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js +1 -1
  391. package/.next/server/chunks/_next-internal_server_app_manifest_webmanifest_route_actions_08hcpz0.js +1 -1
  392. package/.next/server/chunks/node_modules_next_1zdbrne._.js +1 -1
  393. package/.next/server/chunks/node_modules_zod_v4_classic_external_1-pw2v2.js +3 -3
  394. package/.next/server/chunks/src_0tzpy5j._.js +1 -1
  395. package/.next/server/chunks/src_lib_ai_prompts_ts_0z36zms._.js +1 -1
  396. package/.next/server/chunks/src_lib_date-time_ts_14chb27._.js +1 -1
  397. package/.next/server/chunks/src_lib_question-deduplication_ts_1p1bik-._.js +1 -1
  398. package/.next/server/chunks/ssr/[externals]_fs_0pplqgc._.js +1 -1
  399. package/.next/server/chunks/ssr/[root-of-the-server]__00gewu3._.js +3 -3
  400. package/.next/server/chunks/ssr/[root-of-the-server]__03psbtz._.js +3 -0
  401. package/.next/server/chunks/ssr/[root-of-the-server]__05f8wbh._.js +1 -1
  402. package/.next/server/chunks/ssr/[root-of-the-server]__0a0nty7._.js +1 -1
  403. package/.next/server/chunks/ssr/[root-of-the-server]__0ax9dog._.js +1 -1
  404. package/.next/server/chunks/ssr/[root-of-the-server]__0bvtza7._.js +2 -2
  405. package/.next/server/chunks/ssr/[root-of-the-server]__0g_-bym._.js +1 -1
  406. package/.next/server/chunks/ssr/[root-of-the-server]__0gwwr7e._.js +1 -1
  407. package/.next/server/chunks/ssr/[root-of-the-server]__0hzktoi._.js +1 -1
  408. package/.next/server/chunks/ssr/[root-of-the-server]__0koj8h0._.js +1 -1
  409. package/.next/server/chunks/ssr/[root-of-the-server]__0s87xha._.js +1 -1
  410. package/.next/server/chunks/ssr/[root-of-the-server]__0skyo1a._.js +3 -0
  411. package/.next/server/chunks/ssr/[root-of-the-server]__0snpjfe._.js +1 -1
  412. package/.next/server/chunks/ssr/[root-of-the-server]__0y_e9do._.js +1 -1
  413. package/.next/server/chunks/ssr/[root-of-the-server]__0ybs_4c._.js +1 -1
  414. package/.next/server/chunks/ssr/[root-of-the-server]__14l7peq._.js +1 -1
  415. package/.next/server/chunks/ssr/[root-of-the-server]__1507q8a._.js +1 -1
  416. package/.next/server/chunks/ssr/[root-of-the-server]__15ppb9j._.js +1 -1
  417. package/.next/server/chunks/ssr/[root-of-the-server]__191jn5n._.js +1 -1
  418. package/.next/server/chunks/ssr/[root-of-the-server]__1f2jx51._.js +2 -2
  419. package/.next/server/chunks/ssr/[root-of-the-server]__1gth76-._.js +1 -1
  420. package/.next/server/chunks/ssr/[root-of-the-server]__1ko_dw5._.js +1 -1
  421. package/.next/server/chunks/ssr/[root-of-the-server]__1l84pks._.js +1 -1
  422. package/.next/server/chunks/ssr/[root-of-the-server]__1m7qw-2._.js +1 -1
  423. package/.next/server/chunks/ssr/[root-of-the-server]__1ma2oml._.js +1 -1
  424. package/.next/server/chunks/ssr/[root-of-the-server]__1o8jotz._.js +1 -1
  425. package/.next/server/chunks/ssr/[root-of-the-server]__1o__w27._.js +1 -1
  426. package/.next/server/chunks/ssr/[root-of-the-server]__1p7f0va._.js +1 -1
  427. package/.next/server/chunks/ssr/[root-of-the-server]__1sg9eoj._.js +1 -1
  428. package/.next/server/chunks/ssr/[root-of-the-server]__1u74hyi._.js +1 -1
  429. package/.next/server/chunks/ssr/[root-of-the-server]__1xsovpr._.js +1 -1
  430. package/.next/server/chunks/ssr/_054yhx9._.js +1 -1
  431. package/.next/server/chunks/ssr/_07ls0n_._.js +1 -1
  432. package/.next/server/chunks/ssr/_0i9hwpv._.js +1 -1
  433. package/.next/server/chunks/ssr/_0iqp5hs._.js +1 -1
  434. package/.next/server/chunks/ssr/_0m1-rq-._.js +1 -1
  435. package/.next/server/chunks/ssr/_0mgbe2b._.js +1 -1
  436. package/.next/server/chunks/ssr/_0nv22wt._.js +1 -1
  437. package/.next/server/chunks/ssr/_0rz2_qb._.js +5 -5
  438. package/.next/server/chunks/ssr/_0sbbx9z._.js +2 -2
  439. package/.next/server/chunks/ssr/_0sf1gd9._.js +1 -1
  440. package/.next/server/chunks/ssr/_0uemk57._.js +1 -1
  441. package/.next/server/chunks/ssr/_0zj7dlu._.js +1 -1
  442. package/.next/server/chunks/ssr/_11ut-6_._.js +3 -0
  443. package/.next/server/chunks/ssr/_17igtpd._.js +1 -1
  444. package/.next/server/chunks/ssr/_1aot_70._.js +3 -0
  445. package/.next/server/chunks/ssr/_1filpif._.js +3 -0
  446. package/.next/server/chunks/ssr/_1jniqsj._.js +1 -1
  447. package/.next/server/chunks/ssr/_1kgnhmo._.js +2 -2
  448. package/.next/server/chunks/ssr/_1lt1lhz._.js +2 -2
  449. package/.next/server/chunks/ssr/_1yeu09q._.js +1 -1
  450. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +1 -1
  451. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +1 -1
  452. package/.next/server/chunks/ssr/_next-internal_server_app_admin_page_actions_1mcickz.js +1 -1
  453. package/.next/server/chunks/ssr/_next-internal_server_app_admin_user_[id]_page_actions_0baj8gs.js +1 -1
  454. package/.next/server/chunks/ssr/_next-internal_server_app_error-items_[id]_page_actions_0qla9ak.js +1 -1
  455. package/.next/server/chunks/ssr/_next-internal_server_app_exams_[id]_print_page_actions_0pxdgxq.js +1 -1
  456. package/.next/server/chunks/ssr/_next-internal_server_app_exams_page_actions_0av69f-.js +1 -1
  457. package/.next/server/chunks/ssr/_next-internal_server_app_latex-test_page_actions_19v7ka0.js +1 -1
  458. package/.next/server/chunks/ssr/_next-internal_server_app_login_page_actions_04fnjo0.js +1 -1
  459. package/.next/server/chunks/ssr/_next-internal_server_app_notebooks_[id]_add_page_actions_0275ft2.js +1 -1
  460. package/.next/server/chunks/ssr/_next-internal_server_app_notebooks_[id]_page_actions_1qj0i-7.js +1 -1
  461. package/.next/server/chunks/ssr/_next-internal_server_app_notebooks_page_actions_06x1kdz.js +1 -1
  462. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_0hhsz1j.js +1 -1
  463. package/.next/server/chunks/ssr/_next-internal_server_app_practice_page_actions_0cy-h5n.js +1 -1
  464. package/.next/server/chunks/ssr/_next-internal_server_app_print-preview_page_actions_1jhaaln.js +1 -1
  465. package/.next/server/chunks/ssr/_next-internal_server_app_register_page_actions_1op-s-x.js +1 -1
  466. package/.next/server/chunks/ssr/_next-internal_server_app_stats_page_actions_1olf1_a.js +1 -1
  467. package/.next/server/chunks/ssr/node_modules_0o2aki7._.js +1 -1
  468. package/.next/server/chunks/ssr/node_modules_1y5ym6h._.js +1 -1
  469. package/.next/server/chunks/ssr/node_modules_next_1lnqo1a._.js +3 -3
  470. package/.next/server/chunks/ssr/node_modules_next_dist_077yo5w._.js +1 -1
  471. package/.next/server/chunks/ssr/node_modules_next_dist_0nkkbfv._.js +2 -2
  472. package/.next/server/chunks/ssr/node_modules_next_dist_1_c-t1n._.js +4 -4
  473. package/.next/server/chunks/ssr/node_modules_next_dist_1v8aef8._.js +1 -1
  474. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0bew68i._.js +2 -2
  475. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +1 -1
  476. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +1 -1
  477. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +1 -1
  478. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +1 -1
  479. package/.next/server/chunks/ssr/src_1biegcg._.js +1 -1
  480. package/.next/server/chunks/ssr/src_1gayunq._.js +1 -1
  481. package/.next/server/chunks/ssr/src_1o363ao._.js +1 -1
  482. package/.next/server/chunks/ssr/src_app_admin_page_tsx_0ublbd0._.js +1 -1
  483. package/.next/server/chunks/ssr/src_app_error-items_[id]_page_tsx_04xwwdm._.js +1 -1
  484. package/.next/server/chunks/ssr/src_app_notebooks_[id]_page_tsx_08njm-5._.js +1 -1
  485. package/.next/server/chunks/ssr/src_app_notebooks_page_tsx_1p9src5._.js +1 -1
  486. package/.next/server/chunks/ssr/src_app_page_tsx_1chiuah._.js +1 -1
  487. package/.next/server/chunks/ssr/src_app_practice_page_tsx_10gnx53._.js +1 -1
  488. package/.next/server/chunks/ssr/src_app_tags_page_tsx_1h2vkk4._.js +1 -1
  489. package/.next/server/chunks/ssr/src_components_providers_tsx_09kw-mv._.js +2 -2
  490. package/.next/server/chunks/ssr/src_lib_date-time_ts_0oyqctn._.js +1 -1
  491. package/.next/server/edge/chunks/[root-of-the-server]__1osrt2u._.js +1 -1
  492. package/.next/server/edge/chunks/_1s0wgnu._.js +1 -1
  493. package/.next/server/edge/chunks/node_modules_0g4gi6f._.js +3 -3
  494. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_1iafar9.js +1 -1
  495. package/.next/server/edge/chunks/turbopack-node_modules_next_dist_esm_build_templates_edge-wrapper_1x1n1fx.js +1 -1
  496. package/.next/server/instrumentation.js +2 -2
  497. package/.next/server/middleware-build-manifest.js +8 -8
  498. package/.next/server/middleware-manifest.json +5 -5
  499. package/.next/server/pages/500.html +1 -1
  500. package/.next/server/server-reference-manifest.js +1 -1
  501. package/.next/server/server-reference-manifest.json +1 -1
  502. package/.next/static/chunks/03gmdewlo3s6u.js +1 -0
  503. package/.next/static/chunks/06q8lm6y95ac4.css +1 -0
  504. package/.next/static/chunks/0_w084ms_lq25.js +22 -0
  505. package/.next/static/chunks/0dzfsm6h13fyr.js +1 -0
  506. package/.next/static/chunks/0ehjiuuxbbhq9.js +1 -0
  507. package/.next/static/chunks/0ij2dqb0qj5ry.js +1 -0
  508. package/.next/static/chunks/0iq53qkw5hvrs.js +1 -0
  509. package/.next/static/chunks/0m81l71kojx8j.js +1 -0
  510. package/.next/static/chunks/0nckb2-62ooyq.js +1 -0
  511. package/.next/static/chunks/0pwdmc9gw8ben.js +33 -0
  512. package/.next/static/chunks/0snej-v5yglxr.js +1 -0
  513. package/.next/static/chunks/1-7k9gbbjkcml.js +1 -0
  514. package/.next/static/chunks/1c92up8k2x0z4.js +1 -0
  515. package/.next/static/chunks/1cd32rtomdngh.js +1 -0
  516. package/.next/static/chunks/1io3-cth_2-cd.js +1 -0
  517. package/.next/static/chunks/1oiuiyv1cv06v.js +31 -0
  518. package/.next/static/chunks/1t4-pobw0y5cf.js +1 -0
  519. package/.next/static/chunks/1xg811762s1p1.js +1 -0
  520. package/.next/static/chunks/1z_5sj1wqi06v.js +1 -0
  521. package/.next/static/chunks/24dymggis4suf.css +3 -0
  522. package/.next/static/chunks/24jbwfpgmio7x.js +1 -0
  523. package/.next/static/chunks/27fr34_1v7xyh.js +1 -0
  524. package/.next/static/chunks/2dlme2fdlkms6.js +1 -0
  525. package/.next/static/chunks/2eu_bls12m1wj.js +1 -0
  526. package/.next/static/chunks/2pmzqbg-qabof.js +1 -0
  527. package/.next/static/chunks/2w2uo9jjxt-re.js +1 -0
  528. package/.next/static/chunks/2x8e_fbze06sd.js +1 -0
  529. package/.next/static/chunks/2z1_5umv36es6.js +191 -0
  530. package/.next/static/chunks/32bl-oqw9oso0.js +1 -0
  531. package/.next/static/chunks/3b-g5_r9nto3s.js +6 -0
  532. package/.next/static/chunks/3g1rm2suowncy.js +3 -0
  533. package/.next/static/chunks/3helovsg02qr4.js +1 -0
  534. package/.next/static/chunks/3jta6jrk-jubq.js +1 -0
  535. package/.next/static/chunks/3m4c1r8_2ga_1.js +1 -0
  536. package/.next/static/chunks/3whzkc6d8oefw.js +1 -0
  537. package/.next/static/chunks/3yhf6xyypekz6.js +1 -0
  538. package/.next/static/chunks/3z9gc_02gl8n9.js +1 -0
  539. package/.next/static/chunks/427wg73nuzpiz.js +5 -0
  540. package/.next/static/chunks/turbopack-1-0r7_puvz3eq.js +1 -0
  541. package/launcher.js +22 -6
  542. package/package.json +1 -1
  543. package/prisma/seed.db +0 -0
  544. package/.next/server/app/api/error-items/[id]/mastery/route/app-paths-manifest.json +0 -3
  545. package/.next/server/app/api/error-items/[id]/mastery/route/build-manifest.json +0 -12
  546. package/.next/server/app/api/error-items/[id]/mastery/route/server-reference-manifest.json +0 -4
  547. package/.next/server/app/api/error-items/[id]/mastery/route.js +0 -8
  548. package/.next/server/app/api/error-items/[id]/mastery/route.js.map +0 -5
  549. package/.next/server/app/api/error-items/[id]/mastery/route.js.nft.json +0 -1
  550. package/.next/server/app/api/error-items/[id]/mastery/route_client-reference-manifest.js +0 -3
  551. package/.next/server/chunks/[externals]__1735khz._.js +0 -3
  552. package/.next/server/chunks/[root-of-the-server]__02j1w81._.js +0 -3
  553. package/.next/server/chunks/[root-of-the-server]__03nfvnm._.js +0 -3
  554. package/.next/server/chunks/[root-of-the-server]__04tyyvs._.js +0 -3
  555. package/.next/server/chunks/[root-of-the-server]__05s4wut._.js +0 -3
  556. package/.next/server/chunks/[root-of-the-server]__06_nln5._.js +0 -3
  557. package/.next/server/chunks/[root-of-the-server]__06h5afw._.js +0 -3
  558. package/.next/server/chunks/[root-of-the-server]__0be5c5r._.js +0 -3
  559. package/.next/server/chunks/[root-of-the-server]__0bqawi0._.js +0 -3
  560. package/.next/server/chunks/[root-of-the-server]__0bsw5c9._.js +0 -3
  561. package/.next/server/chunks/[root-of-the-server]__0c59gc3._.js +0 -3
  562. package/.next/server/chunks/[root-of-the-server]__0cmxmwt._.js +0 -3
  563. package/.next/server/chunks/[root-of-the-server]__0d5dpu4._.js +0 -3
  564. package/.next/server/chunks/[root-of-the-server]__0d9ijed._.js +0 -3
  565. package/.next/server/chunks/[root-of-the-server]__0e22a4y._.js +0 -122
  566. package/.next/server/chunks/[root-of-the-server]__0fnyu4s._.js +0 -3
  567. package/.next/server/chunks/[root-of-the-server]__0gp88gz._.js +0 -3
  568. package/.next/server/chunks/[root-of-the-server]__0inxsnu._.js +0 -3
  569. package/.next/server/chunks/[root-of-the-server]__0j5231l._.js +0 -3
  570. package/.next/server/chunks/[root-of-the-server]__0jaawra._.js +0 -3
  571. package/.next/server/chunks/[root-of-the-server]__0k-nf6a._.js +0 -3
  572. package/.next/server/chunks/[root-of-the-server]__0k-p1pj._.js +0 -3
  573. package/.next/server/chunks/[root-of-the-server]__0lrdm1u._.js +0 -3
  574. package/.next/server/chunks/[root-of-the-server]__0lro5a7._.js +0 -3
  575. package/.next/server/chunks/[root-of-the-server]__0mfjf2y._.js +0 -3
  576. package/.next/server/chunks/[root-of-the-server]__0mqorxb._.js +0 -3
  577. package/.next/server/chunks/[root-of-the-server]__0no6umu._.js +0 -3
  578. package/.next/server/chunks/[root-of-the-server]__0nqbham._.js +0 -3
  579. package/.next/server/chunks/[root-of-the-server]__0o9gtvd._.js +0 -3
  580. package/.next/server/chunks/[root-of-the-server]__0obb4y-._.js +0 -3
  581. package/.next/server/chunks/[root-of-the-server]__0p3u6_q._.js +0 -3
  582. package/.next/server/chunks/[root-of-the-server]__0rmrkd_._.js +0 -3
  583. package/.next/server/chunks/[root-of-the-server]__0tdibjz._.js +0 -3
  584. package/.next/server/chunks/[root-of-the-server]__0u58zap._.js +0 -3
  585. package/.next/server/chunks/[root-of-the-server]__0vhjihq._.js +0 -3
  586. package/.next/server/chunks/[root-of-the-server]__0vz88er._.js +0 -3
  587. package/.next/server/chunks/[root-of-the-server]__0wf9znr._.js +0 -3
  588. package/.next/server/chunks/[root-of-the-server]__0yc8r2x._.js +0 -3
  589. package/.next/server/chunks/[root-of-the-server]__0zv7jom._.js +0 -3
  590. package/.next/server/chunks/[root-of-the-server]__11_1z7m._.js +0 -3
  591. package/.next/server/chunks/[root-of-the-server]__11n87go._.js +0 -3
  592. package/.next/server/chunks/[root-of-the-server]__11p4ahb._.js +0 -3
  593. package/.next/server/chunks/[root-of-the-server]__131taws._.js +0 -3
  594. package/.next/server/chunks/[root-of-the-server]__13ebiit._.js +0 -3
  595. package/.next/server/chunks/[root-of-the-server]__1413v0e._.js +0 -3
  596. package/.next/server/chunks/[root-of-the-server]__14dnbrn._.js +0 -3
  597. package/.next/server/chunks/[root-of-the-server]__14jqm9_._.js +0 -3
  598. package/.next/server/chunks/[root-of-the-server]__152lbaw._.js +0 -3
  599. package/.next/server/chunks/[root-of-the-server]__16begv4._.js +0 -3
  600. package/.next/server/chunks/[root-of-the-server]__17duis5._.js +0 -3
  601. package/.next/server/chunks/[root-of-the-server]__17q3k-v._.js +0 -3
  602. package/.next/server/chunks/[root-of-the-server]__184u6de._.js +0 -3
  603. package/.next/server/chunks/[root-of-the-server]__18atlj8._.js +0 -3
  604. package/.next/server/chunks/[root-of-the-server]__18c7l6u._.js +0 -3
  605. package/.next/server/chunks/[root-of-the-server]__18zrkky._.js +0 -3
  606. package/.next/server/chunks/[root-of-the-server]__19vj8qy._.js +0 -3
  607. package/.next/server/chunks/[root-of-the-server]__1aaux7e._.js +0 -3
  608. package/.next/server/chunks/[root-of-the-server]__1cceu4b._.js +0 -3
  609. package/.next/server/chunks/[root-of-the-server]__1cn6rlb._.js +0 -3
  610. package/.next/server/chunks/[root-of-the-server]__1csfdxc._.js +0 -3
  611. package/.next/server/chunks/[root-of-the-server]__1ezwxao._.js +0 -3
  612. package/.next/server/chunks/[root-of-the-server]__1g1wi9i._.js +0 -3
  613. package/.next/server/chunks/[root-of-the-server]__1gmc_uw._.js +0 -3
  614. package/.next/server/chunks/[root-of-the-server]__1h09r50._.js +0 -3
  615. package/.next/server/chunks/[root-of-the-server]__1hpwwxw._.js +0 -3
  616. package/.next/server/chunks/[root-of-the-server]__1j6mx-v._.js +0 -3
  617. package/.next/server/chunks/[root-of-the-server]__1jdi-1f._.js +0 -3
  618. package/.next/server/chunks/[root-of-the-server]__1ju8z29._.js +0 -3
  619. package/.next/server/chunks/[root-of-the-server]__1kqv61m._.js +0 -3
  620. package/.next/server/chunks/[root-of-the-server]__1lct0vi._.js +0 -3
  621. package/.next/server/chunks/[root-of-the-server]__1loecue._.js +0 -3
  622. package/.next/server/chunks/[root-of-the-server]__1m4-ab6._.js +0 -3
  623. package/.next/server/chunks/[root-of-the-server]__1mkpya8._.js +0 -3
  624. package/.next/server/chunks/[root-of-the-server]__1nwf3ua._.js +0 -3
  625. package/.next/server/chunks/[root-of-the-server]__1oup682._.js +0 -3
  626. package/.next/server/chunks/[root-of-the-server]__1p8hw44._.js +0 -3
  627. package/.next/server/chunks/[root-of-the-server]__1pplzr1._.js +0 -3
  628. package/.next/server/chunks/[root-of-the-server]__1rsn804._.js +0 -3
  629. package/.next/server/chunks/[root-of-the-server]__1sdtn83._.js +0 -3
  630. package/.next/server/chunks/[root-of-the-server]__1u-1vx4._.js +0 -3
  631. package/.next/server/chunks/[root-of-the-server]__1v6nwhq._.js +0 -3
  632. package/.next/server/chunks/[root-of-the-server]__20465pr._.js +0 -3
  633. package/.next/server/chunks/[root-of-the-server]__207mxv8._.js +0 -3
  634. package/.next/server/chunks/_0_o8yhv._.js +0 -3
  635. package/.next/server/chunks/_0c5hvv3._.js +0 -11
  636. package/.next/server/chunks/_0frix22._.js +0 -11
  637. package/.next/server/chunks/_0rdo0a4._.js +0 -3
  638. package/.next/server/chunks/_167vv93._.js +0 -3
  639. package/.next/server/chunks/_1e1h1f1._.js +0 -3
  640. package/.next/server/chunks/_1flar98._.js +0 -3
  641. package/.next/server/chunks/_next-internal_server_app_api_error-items_[id]_mastery_route_actions_1l5uan6.js +0 -3
  642. package/.next/server/chunks/ssr/[root-of-the-server]__0b8kewv._.js +0 -3
  643. package/.next/server/chunks/ssr/[root-of-the-server]__0icjezr._.js +0 -3
  644. package/.next/server/chunks/ssr/_062gk85._.js +0 -3
  645. package/.next/server/chunks/ssr/_0idg05p._.js +0 -3
  646. package/.next/server/chunks/ssr/_1gu1rou._.js +0 -3
  647. package/.next/static/chunks/02d-8f2qj7j3j.js +0 -1
  648. package/.next/static/chunks/02t7qqptint2p.js +0 -1
  649. package/.next/static/chunks/090a6irxe0c6j.js +0 -1
  650. package/.next/static/chunks/0bhxyq7e2eqjc.js +0 -5
  651. package/.next/static/chunks/0if-vqkhyn-zc.js +0 -1
  652. package/.next/static/chunks/0jf31atbtr1mv.js +0 -1
  653. package/.next/static/chunks/0te6mr86gdyyi.js +0 -191
  654. package/.next/static/chunks/0vgthy7v615hq.js +0 -1
  655. package/.next/static/chunks/1e5n4cprhwujv.js +0 -1
  656. package/.next/static/chunks/1edfvwc5_eck-.js +0 -31
  657. package/.next/static/chunks/1f0u19gh5_49z.js +0 -1
  658. package/.next/static/chunks/1fdj59ys-pend.js +0 -1
  659. package/.next/static/chunks/1kerqdluzq2l0.js +0 -1
  660. package/.next/static/chunks/1r4lwlvm7m53v.js +0 -1
  661. package/.next/static/chunks/1rz1bokv9edzr.js +0 -1
  662. package/.next/static/chunks/1s-d67d-yroyw.js +0 -1
  663. package/.next/static/chunks/1tw5_upsy-qj_.js +0 -22
  664. package/.next/static/chunks/1w1xvldfmcs67.js +0 -6
  665. package/.next/static/chunks/1zdof8ylzqm8w.js +0 -1
  666. package/.next/static/chunks/2-k1hjh6ff6y4.js +0 -1
  667. package/.next/static/chunks/21qpve5q3mjly.js +0 -1
  668. package/.next/static/chunks/21v32ctwcoxqt.js +0 -1
  669. package/.next/static/chunks/27-t289uq6_ju.js +0 -3
  670. package/.next/static/chunks/293-te2b34thz.js +0 -1
  671. package/.next/static/chunks/2dgleoh5fbs83.js +0 -1
  672. package/.next/static/chunks/2di_nd6djcxwu.js +0 -1
  673. package/.next/static/chunks/2mk03owifu2m1.js +0 -33
  674. package/.next/static/chunks/2qza4p5d9fz_2.js +0 -1
  675. package/.next/static/chunks/2s4c8fcrdnew4.js +0 -1
  676. package/.next/static/chunks/2zdqnkem9n6a9.js +0 -1
  677. package/.next/static/chunks/3-wm04s--suy5.js +0 -1
  678. package/.next/static/chunks/33t46atd3n2zd.js +0 -1
  679. package/.next/static/chunks/37yx4gh09tzwc.js +0 -1
  680. package/.next/static/chunks/3c4-ozf1dxam2.css +0 -1
  681. package/.next/static/chunks/3gwb465dhjxo9.js +0 -1
  682. package/.next/static/chunks/3hkgw-uib19xl.js +0 -1
  683. package/.next/static/chunks/3n-yabfsiog4i.css +0 -3
  684. package/.next/static/chunks/3umldi5zknsyi.js +0 -1
  685. package/.next/static/chunks/turbopack-1yjxh4vceobdr.js +0 -1
  686. /package/.next/static/{678uJSzOSzePaLyv5hUv0 → Y0pwgmRdVAifh_zukihNt}/_buildManifest.js +0 -0
  687. /package/.next/static/{678uJSzOSzePaLyv5hUv0 → Y0pwgmRdVAifh_zukihNt}/_clientMiddlewareManifest.js +0 -0
  688. /package/.next/static/{678uJSzOSzePaLyv5hUv0 → Y0pwgmRdVAifh_zukihNt}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[61312,e=>e.a(async(t,a)=>{try{var r=e.i(89171),n=e.i(843911),s=e.i(79832),i=e.i(757660),o=e.i(183508),l=e.i(539811),u=e.i(698043),d=e.i(181912),c=e.i(459398),p=e.i(668426),g=e.i(50377),R=e.i(926828),h=e.i(798003),m=t([s]);[s]=m.then?(await m)():m;let A=(0,g.createLogger)("api:analyze");async function E(e){A.info("Analyze API called");let t=await (0,i.getServerSession)(s.authOptions);if(!t)return A.warn("Unauthorized access attempt"),r.NextResponse.json({message:"Unauthorized"},{status:401});try{let a,{imageBase64:s,mimeType:i,language:g,subjectId:m}=await e.json();if(A.debug({imageLength:s?.length,mimeType:i,language:g,subjectId:m},"Request received"),!s)return A.warn("Missing image data"),(0,d.badRequest)("Missing image data");if(s.startsWith("data:")){let e=s.match(/^data:([^;]+);base64,(.+)$/);e&&(i=e[1],s=e[2],A.debug({mimeType:i,base64Length:s.length},"Parsed Data URL"))}let E=null,v=null,w=null,f=null;if(t?.user?.email)try{let e=await u.prisma.user.findUnique({where:{email:t.user.email},select:{id:!0,educationStage:!0,enrollmentYear:!0}});if(e&&(E=(0,o.calculateGradeNumber)(e.educationStage,e.enrollmentYear,(0,h.getAppTimeZone)()),e.educationStage&&e.enrollmentYear&&(v=(0,l.calculateGrade)(e.educationStage,e.enrollmentYear,new Date,"zh",(0,h.getAppTimeZone)())),A.debug({userGrade:E,userGradeSemester:v},"Calculated user grade")),m&&e){let t=await u.prisma.subject.findUnique({where:{id:m},select:{name:!0,userId:!0,stage:!0,subjectKey:!0}});if(t&&t.userId===e.id){f=t.name;let e=(0,p.resolveNotebookScope)(t);w=e.subject?p.SUBJECT_DISPLAY_NAMES[e.subject]:null,a=await (0,c.getNotebookCandidateTags)(e),A.debug({scope:e,candidateTagCount:a?.tags.length},"Notebook scope resolved")}}}catch(e){A.error({error:e},"Error fetching user/subject info")}A.info({userGrade:E,userGradeSemester:v,subject:w},"Calling AI service for image analysis");let C=(0,n.getAIService)(),y=await (0,R.trackBackgroundTask)({userId:t.user.id,kind:"analyze",subject:f},()=>C.analyzeImage(s,i,g,E,w,v,a));return A.debug({knowledgePointsCount:y.knowledgePoints?.length,knowledgePointsType:typeof y.knowledgePoints,isArray:Array.isArray(y.knowledgePoints)},"AI returned knowledge points"),y.knowledgePoints&&0!==y.knowledgePoints.length||A.warn("Knowledge points is empty or null"),A.info("AI analysis successful"),r.NextResponse.json(y)}catch(t){A.error({error:t.message,stack:t.stack},"Analysis error occurred");let e=t.message||"Failed to analyze image";return t.message&&("AI_CONNECTION_FAILED"===t.message||"AI_RESPONSE_ERROR"===t.message||t.message.includes("AI_AUTH_ERROR")||"AI_TIMEOUT_ERROR"===t.message||"AI_QUOTA_EXCEEDED"===t.message||"AI_PERMISSION_DENIED"===t.message||"AI_NOT_FOUND"===t.message||"AI_SERVICE_UNAVAILABLE"===t.message||"AI_UNKNOWN_ERROR"===t.message||"AI_OUTPUT_TRUNCATED"===t.message)?e=t.message.includes("AI_AUTH_ERROR")?"AI_AUTH_ERROR":t.message:(t.message?.includes("Zod")||t.message?.includes("validate"))&&(e="AI_RESPONSE_ERROR"),(0,d.createErrorResponse)(e,500,d.ErrorCode.AI_ERROR,t.message)}}e.s(["POST",0,E]),a()}catch(e){a(e)}},!1),826794,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),n=e.i(759756),s=e.i(561916),i=e.i(174677),o=e.i(869741),l=e.i(316795),u=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),g=e.i(570101),R=e.i(626937),h=e.i(10372),m=e.i(193695),E=e.i(509580);e.i(52474);var A=e.i(600220);let v=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/analyze/route",pathname:"/api/analyze",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/analyze/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(61312),...{}}),{workAsyncStorage:w,workUnitAsyncStorage:f,serverHooks:C}=v;async function y(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/analyze/route";w=w.replace(/\/index$/,"")||"/";let f=await v.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!f)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:_,nextConfig:T,parsedUrl:I,isDraftMode:N,prerenderManifest:S,routerServerContext:O,isOnDemandRevalidate:b,revalidateOnlyGenerated:P,resolvedPathname:x,clientReferenceManifest:U,serverActionsManifest:k}=f,D=(0,o.normalizeAppPath)(w),q=!!S.routes[x]&&(v.isDev||(0,E.isRouteCacheOwner)(x,v.cacheOwner,S.routes[x])),H=!!(S.dynamicRoutes[D]||q),M=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,I,!1):t.end("This page could not be found"),null);if(H&&!N){let e=S.dynamicRoutes[D];if(e&&!1===e.fallback&&!q){if(T.adapterPath)return await M();throw new m.NoFallbackError}}let j=null;!H||v.isDev||N||(j="/index"===(j=x)?"/":j);let L=!0===v.isDev||!H,z=H&&!L;k&&U&&(0,i.setManifestsSingleton)({page:w,clientReferenceManifest:U,serverActionsManifest:k});let F=e.method||"GET",K=(0,s.getTracer)(),B=K.getActiveScopeSpan(),$=!!(null==O?void 0:O.isWrappedByNextServer),G=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,T,S,G);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let Y={params:_,previewProps:S.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:N,supportsDynamicResponse:L,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>v.onRequestError(e,t,r,n,O)},sharedContext:{buildId:C,deploymentId:y}},W=new l.NodeNextRequest(e),X=new l.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!G&&b&&P&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Z,Y);e.fetchMetrics=Y.renderOpts.fetchMetrics;let s=Y.renderOpts.pendingWaitUntil;s&&r.waitUntil&&(r.waitUntil(s),s=void 0);let i=Y.renderOpts.collectedTags;if(!H)return await (0,p.sendResponse)(W,X,n,s),null;{let e=await n.blob(),t=(0,g.toNodeOutgoingHttpHeaders)(n.headers);i&&(t[h.NEXT_CACHE_TAGS_HEADER]=i),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==Y.renderOpts.collectedRevalidate&&!(Y.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&Y.renderOpts.collectedRevalidate,r=void 0===Y.renderOpts.collectedExpire||Y.renderOpts.collectedExpire>=h.INFINITE_CACHE?!1!==a&&a>0?T.expireTime:void 0:Y.renderOpts.collectedExpire;return{value:{kind:A.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:z,isOnDemandRevalidate:b})},!1,O),t}},Q=async(n,i)=>{try{var o,l;let n=await v.handleResponse({req:e,nextConfig:T,cacheKey:j,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:S,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:P,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:G});if(!H)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==A.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});G||t.setHeader("x-nextjs-cache",b?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),N&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,g.fromNodeOutgoingHttpHeaders)(n.value.headers);G&&H||s.delete(h.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,R.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,X,new Response(n.value.body,{headers:s,status:n.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:z,isOnDemandRevalidate:b})},!1,O),H)throw t;await (0,p.sendResponse)(W,X,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:s.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=K.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,o=`${F} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":o}),n.updateName(o),i&&i!==n&&(i.setAttribute("http.route",r),i.updateName(o))})()}};if($&&B)await Q(B,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${w}`,kind:s.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>Q(e,t)),void 0,!$)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:w,workUnitAsyncStorage:f})},"routeModule",0,v,"serverHooks",0,C,"workAsyncStorage",0,w,"workUnitAsyncStorage",0,f])}];
1
+ module.exports=[61312,e=>e.a(async(t,a)=>{try{var r=e.i(58821),n=e.i(43911),s=e.i(79832),i=e.i(13618),o=e.i(83508),l=e.i(39811),u=e.i(98043),d=e.i(76759),c=e.i(59398),p=e.i(68426),g=e.i(50377),R=e.i(26828),h=e.i(98003),m=t([s]);[s]=m.then?(await m)():m;let A=(0,g.createLogger)("api:analyze");async function E(e){A.info("Analyze API called");let t=await (0,i.getServerSession)(s.authOptions);if(!t)return A.warn("Unauthorized access attempt"),r.NextResponse.json({message:"Unauthorized"},{status:401});try{let a,{imageBase64:s,mimeType:i,language:g,subjectId:m}=await e.json();if(A.debug({imageLength:s?.length,mimeType:i,language:g,subjectId:m},"Request received"),!s)return A.warn("Missing image data"),(0,d.badRequest)("Missing image data");if(s.startsWith("data:")){let e=s.match(/^data:([^;]+);base64,(.+)$/);e&&(i=e[1],s=e[2],A.debug({mimeType:i,base64Length:s.length},"Parsed Data URL"))}let E=null,v=null,w=null,f=null;if(t?.user?.email)try{let e=await u.prisma.user.findUnique({where:{email:t.user.email},select:{id:!0,educationStage:!0,enrollmentYear:!0}});if(e&&(E=(0,o.calculateGradeNumber)(e.educationStage,e.enrollmentYear,(0,h.getAppTimeZone)()),e.educationStage&&e.enrollmentYear&&(v=(0,l.calculateGrade)(e.educationStage,e.enrollmentYear,new Date,"zh",(0,h.getAppTimeZone)())),A.debug({userGrade:E,userGradeSemester:v},"Calculated user grade")),m&&e){let t=await u.prisma.subject.findUnique({where:{id:m},select:{name:!0,userId:!0,stage:!0,subjectKey:!0}});if(t&&t.userId===e.id){f=t.name;let e=(0,p.resolveNotebookScope)(t);w=e.subject?p.SUBJECT_DISPLAY_NAMES[e.subject]:null,a=await (0,c.getNotebookCandidateTags)(e),A.debug({scope:e,candidateTagCount:a?.tags.length},"Notebook scope resolved")}}}catch(e){A.error({error:e},"Error fetching user/subject info")}A.info({userGrade:E,userGradeSemester:v,subject:w},"Calling AI service for image analysis");let C=(0,n.getAIService)(),y=await (0,R.trackBackgroundTask)({userId:t.user.id,kind:"analyze",subject:f},()=>C.analyzeImage(s,i,g,E,w,v,a));return A.debug({knowledgePointsCount:y.knowledgePoints?.length,knowledgePointsType:typeof y.knowledgePoints,isArray:Array.isArray(y.knowledgePoints)},"AI returned knowledge points"),y.knowledgePoints&&0!==y.knowledgePoints.length||A.warn("Knowledge points is empty or null"),A.info("AI analysis successful"),r.NextResponse.json(y)}catch(t){A.error({error:t.message,stack:t.stack},"Analysis error occurred");let e=t.message||"Failed to analyze image";return t.message&&("AI_CONNECTION_FAILED"===t.message||"AI_RESPONSE_ERROR"===t.message||t.message.includes("AI_AUTH_ERROR")||"AI_TIMEOUT_ERROR"===t.message||"AI_QUOTA_EXCEEDED"===t.message||"AI_PERMISSION_DENIED"===t.message||"AI_NOT_FOUND"===t.message||"AI_SERVICE_UNAVAILABLE"===t.message||"AI_UNKNOWN_ERROR"===t.message||"AI_OUTPUT_TRUNCATED"===t.message)?e=t.message.includes("AI_AUTH_ERROR")?"AI_AUTH_ERROR":t.message:(t.message?.includes("Zod")||t.message?.includes("validate"))&&(e="AI_RESPONSE_ERROR"),(0,d.createErrorResponse)(e,500,d.ErrorCode.AI_ERROR,t.message)}}e.s(["POST",0,E]),a()}catch(e){a(e)}},!1),26794,e=>{"use strict";var t=e.i(47909),a=e.i(74017),r=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),g=e.i(70101),R=e.i(74838),h=e.i(10372),m=e.i(93695),E=e.i(9580);e.i(52474);var A=e.i(220);let v=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/analyze/route",pathname:"/api/analyze",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/analyze/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(61312),...{}}),{workAsyncStorage:w,workUnitAsyncStorage:f,serverHooks:C}=v;async function y(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let w="/api/analyze/route";w=w.replace(/\/index$/,"")||"/";let f=await v.prepare(e,t,{srcPage:w,multiZoneDraftMode:!1});if(!f)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:_,nextConfig:T,parsedUrl:I,isDraftMode:N,prerenderManifest:S,routerServerContext:O,isOnDemandRevalidate:b,revalidateOnlyGenerated:P,resolvedPathname:x,clientReferenceManifest:U,serverActionsManifest:k}=f,D=(0,o.normalizeAppPath)(w),q=!!S.routes[x]&&(v.isDev||(0,E.isRouteCacheOwner)(x,v.cacheOwner,S.routes[x])),H=!!(S.dynamicRoutes[D]||q),M=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,I,!1):t.end("This page could not be found"),null);if(H&&!N){let e=S.dynamicRoutes[D];if(e&&!1===e.fallback&&!q){if(T.adapterPath)return await M();throw new m.NoFallbackError}}let j=null;!H||v.isDev||N||(j="/index"===(j=x)?"/":j);let L=!0===v.isDev||!H,z=H&&!L;k&&U&&(0,i.setManifestsSingleton)({page:w,clientReferenceManifest:U,serverActionsManifest:k});let F=e.method||"GET",K=(0,s.getTracer)(),B=K.getActiveScopeSpan(),$=!!(null==O?void 0:O.isWrappedByNextServer),G=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,T,S,G);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let Y={params:_,previewProps:S.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:N,supportsDynamicResponse:L,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>v.onRequestError(e,t,r,n,O)},sharedContext:{buildId:C,deploymentId:y}},W=new l.NodeNextRequest(e),X=new l.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!G&&b&&P&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Z,Y);e.fetchMetrics=Y.renderOpts.fetchMetrics;let s=Y.renderOpts.pendingWaitUntil;s&&r.waitUntil&&(r.waitUntil(s),s=void 0);let i=Y.renderOpts.collectedTags;if(!H)return await (0,p.sendResponse)(W,X,n,s),null;{let e=await n.blob(),t=(0,g.toNodeOutgoingHttpHeaders)(n.headers);i&&(t[h.NEXT_CACHE_TAGS_HEADER]=i),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==Y.renderOpts.collectedRevalidate&&!(Y.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&Y.renderOpts.collectedRevalidate,r=void 0===Y.renderOpts.collectedExpire||Y.renderOpts.collectedExpire>=h.INFINITE_CACHE?!1!==a&&a>0?T.expireTime:void 0:Y.renderOpts.collectedExpire;return{value:{kind:A.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:w,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:z,isOnDemandRevalidate:b})},!1,O),t}},Q=async(n,i)=>{try{var o,l;let n=await v.handleResponse({req:e,nextConfig:T,cacheKey:j,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:S,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:P,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:G});if(!H)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==A.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});G||t.setHeader("x-nextjs-cache",b?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),N&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,g.fromNodeOutgoingHttpHeaders)(n.value.headers);G&&H||s.delete(h.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,R.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,X,new Response(n.value.body,{headers:s,status:n.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:z,isOnDemandRevalidate:b})},!1,O),H)throw t;await (0,p.sendResponse)(W,X,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:s.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=K.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,o=`${F} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":o}),n.updateName(o),i&&i!==n&&(i.setAttribute("http.route",r),i.updateName(o))})()}};if($&&B)await Q(B,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${w}`,kind:s.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>Q(e,t)),void 0,!$)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:w,workUnitAsyncStorage:f})},"routeModule",0,v,"serverHooks",0,C,"workAsyncStorage",0,w,"workUnitAsyncStorage",0,f])}];
2
2
 
3
3
  //# sourceMappingURL=_1a1udq0._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[581510,e=>e.a(async(t,r)=>{try{var a=e.i(89171),n=e.i(698043),i=e.i(79832),o=e.i(757660),s=e.i(181912),u=e.i(50377),l=e.i(926828),d=e.i(843911),c=t([i]);[i]=c.then?(await c)():c;let m=(0,u.createLogger)("api:error-items:geogebra");async function p(e,{params:t}){let{id:r}=await t,u=await (0,o.getServerSession)(i.authOptions);try{let t;if(u?.user?.email&&(t=await n.prisma.user.findUnique({where:{email:u.user.email}})),!t)return(0,s.unauthorized)("Authentication required");let i=await n.prisma.errorItem.findUnique({where:{id:r},include:{subject:!0}});if(!i)return(0,s.notFound)("Item not found");if(i.userId!==t.id)return(0,s.forbidden)("Not authorized to access this item");let o=i.subject?.name||"";if(!(o.includes("数学")||o.toLowerCase().includes("math")||o.includes("物理")||o.toLowerCase().includes("physics")))return a.NextResponse.json({suitable:!1,commands:[],description:"仅数学和物理题目支持 GeoGebra 动态演示"});if(!i.questionText)return a.NextResponse.json({suitable:!1,commands:[],description:"题目文本为空,无法分析"});let c=(0,d.getAIService)(),p=await e.json().catch(()=>({})),h=p.questionText||i.questionText,g=p.answerText||i.answerText||"",R=p.previousErrors||"",f=await (0,l.trackBackgroundTask)({userId:t.id,kind:"geogebra",subject:(0,l.describeQuestion)(i),link:`/error-items/${r}`},()=>c.analyzeForGeogebra(h,g,i.analysis||"",R));return f.suitable&&f.commands.length>0&&await n.prisma.errorItem.update({where:{id:r},data:{geogebraCommands:JSON.stringify(f.commands)}}),m.info({id:r,suitable:f.suitable,commandCount:f.commands.length},"GeoGebra analysis complete"),a.NextResponse.json(f)}catch(t){m.error({error:t},"Error during GeoGebra analysis");let e=t instanceof Error?t.message:String(t);if(e.startsWith("AI_"))return a.NextResponse.json({message:e},{status:502});return(0,s.internalError)("Failed to analyze for GeoGebra")}}async function h(e,{params:t}){let{id:r}=await t,u=await (0,o.getServerSession)(i.authOptions);try{let e=u?.user?.email?await n.prisma.user.findUnique({where:{email:u.user.email}}):null;if(!e)return(0,s.unauthorized)("Authentication required");let t=await n.prisma.errorItem.findUnique({where:{id:r},select:{userId:!0}});if(!t)return(0,s.notFound)("Item not found");if(t.userId!==e.id)return(0,s.forbidden)("Not authorized to access this item");return await n.prisma.errorItem.update({where:{id:r},data:{geogebraCommands:null}}),m.info({id:r},"GeoGebra commands deleted"),a.NextResponse.json({success:!0})}catch(e){return m.error({error:e},"Error deleting GeoGebra commands"),(0,s.internalError)("Failed to delete GeoGebra commands")}}e.s(["DELETE",0,h,"POST",0,p]),r()}catch(e){r(e)}},!1),66639,e=>{"use strict";var t=e.i(747909),r=e.i(174017),a=e.i(996250),n=e.i(759756),i=e.i(561916),o=e.i(174677),s=e.i(869741),u=e.i(316795),l=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),m=e.i(626937),g=e.i(10372),R=e.i(193695),f=e.i(509580);e.i(52474);var w=e.i(600220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/error-items/[id]/geogebra/route",pathname:"/api/error-items/[id]/geogebra",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/error-items/[id]/geogebra/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(581510),...{}}),{workAsyncStorage:b,workUnitAsyncStorage:E,serverHooks:C}=v;async function x(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let b="/api/error-items/[id]/geogebra/route";b=b.replace(/\/index$/,"")||"/";let E=await v.prepare(e,t,{srcPage:b,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:C,deploymentId:x,params:y,nextConfig:T,parsedUrl:A,isDraftMode:S,prerenderManifest:N,routerServerContext:I,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,resolvedPathname:P,clientReferenceManifest:_,serverActionsManifest:G}=E,H=(0,s.normalizeAppPath)(b),U=!!N.routes[P]&&(v.isDev||(0,f.isRouteCacheOwner)(P,v.cacheOwner,N.routes[P])),k=!!(N.dynamicRoutes[H]||U),j=async()=>((null==I?void 0:I.render404)?await I.render404(e,t,A,!1):t.end("This page could not be found"),null);if(k&&!S){let e=N.dynamicRoutes[H];if(e&&!1===e.fallback&&!U){if(T.adapterPath)return await j();throw new R.NoFallbackError}}let M=null;!k||v.isDev||S||(M="/index"===(M=P)?"/":M);let D=!0===v.isDev||!k,F=k&&!D;G&&_&&(0,o.setManifestsSingleton)({page:b,clientReferenceManifest:_,serverActionsManifest:G});let L=e.method||"GET",K=(0,i.getTracer)(),$=K.getActiveScopeSpan(),z=!!(null==I?void 0:I.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,T,N,B);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let W={params:y,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:S,supportsDynamicResponse:D,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,I)},sharedContext:{buildId:C,deploymentId:x}},X=new u.NodeNextRequest(e),J=new u.NodeNextResponse(t),Q=l.NextRequestAdapter.fromNodeNextRequest(X,(0,l.signalFromNodeResponse)(t)),Z=async({previousCacheEntry:r})=>{try{if(!B&&q&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Q,W);e.fetchMetrics=W.renderOpts.fetchMetrics;let i=W.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let o=W.renderOpts.collectedTags;if(!k)return await (0,p.sendResponse)(X,J,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[g.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==W.renderOpts.collectedRevalidate&&!(W.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&W.renderOpts.collectedRevalidate,a=void 0===W.renderOpts.collectedExpire||W.renderOpts.collectedExpire>=g.INFINITE_CACHE?!1!==r&&r>0?T.expireTime:void 0:W.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:b,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:q})},!1,I),t}},Y=async(n,o)=>{try{var s,u;let n=await v.handleResponse({req:e,nextConfig:T,cacheKey:M,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,responseGenerator:Z,waitUntil:a.waitUntil,isMinimalMode:B});if(!k)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",q?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);B&&k||i.delete(g.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(X,J,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:q})},!1,I),k)throw t;await (0,p.sendResponse)(X,J,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||H,s=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",a),o.updateName(s))})()}};if(z&&$)await Y($,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${b}`,kind:i.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!z)}}e.s(["handler",0,x,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:E})},"routeModule",0,v,"serverHooks",0,C,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,E])}];
1
+ module.exports=[81510,e=>e.a(async(t,r)=>{try{var a=e.i(58821),n=e.i(98043),i=e.i(79832),o=e.i(13618),s=e.i(76759),u=e.i(50377),l=e.i(26828),d=e.i(43911),c=t([i]);[i]=c.then?(await c)():c;let m=(0,u.createLogger)("api:error-items:geogebra");async function p(e,{params:t}){let{id:r}=await t,u=await (0,o.getServerSession)(i.authOptions);try{let t;if(u?.user?.email&&(t=await n.prisma.user.findUnique({where:{email:u.user.email}})),!t)return(0,s.unauthorized)("Authentication required");let i=await n.prisma.errorItem.findUnique({where:{id:r},include:{subject:!0}});if(!i)return(0,s.notFound)("Item not found");if(i.userId!==t.id)return(0,s.forbidden)("Not authorized to access this item");let o=i.subject?.name||"";if(!(o.includes("数学")||o.toLowerCase().includes("math")||o.includes("物理")||o.toLowerCase().includes("physics")))return a.NextResponse.json({suitable:!1,commands:[],description:"仅数学和物理题目支持 GeoGebra 动态演示"});if(!i.questionText)return a.NextResponse.json({suitable:!1,commands:[],description:"题目文本为空,无法分析"});let c=(0,d.getAIService)(),p=await e.json().catch(()=>({})),h=p.questionText||i.questionText,g=p.answerText||i.answerText||"",R=p.previousErrors||"",f=await (0,l.trackBackgroundTask)({userId:t.id,kind:"geogebra",subject:(0,l.describeQuestion)(i),link:`/error-items/${r}`},()=>c.analyzeForGeogebra(h,g,i.analysis||"",R));return f.suitable&&f.commands.length>0&&await n.prisma.errorItem.update({where:{id:r},data:{geogebraCommands:JSON.stringify(f.commands)}}),m.info({id:r,suitable:f.suitable,commandCount:f.commands.length},"GeoGebra analysis complete"),a.NextResponse.json(f)}catch(t){m.error({error:t},"Error during GeoGebra analysis");let e=t instanceof Error?t.message:String(t);if(e.startsWith("AI_"))return a.NextResponse.json({message:e},{status:502});return(0,s.internalError)("Failed to analyze for GeoGebra")}}async function h(e,{params:t}){let{id:r}=await t,u=await (0,o.getServerSession)(i.authOptions);try{let e=u?.user?.email?await n.prisma.user.findUnique({where:{email:u.user.email}}):null;if(!e)return(0,s.unauthorized)("Authentication required");let t=await n.prisma.errorItem.findUnique({where:{id:r},select:{userId:!0}});if(!t)return(0,s.notFound)("Item not found");if(t.userId!==e.id)return(0,s.forbidden)("Not authorized to access this item");return await n.prisma.errorItem.update({where:{id:r},data:{geogebraCommands:null}}),m.info({id:r},"GeoGebra commands deleted"),a.NextResponse.json({success:!0})}catch(e){return m.error({error:e},"Error deleting GeoGebra commands"),(0,s.internalError)("Failed to delete GeoGebra commands")}}e.s(["DELETE",0,h,"POST",0,p]),r()}catch(e){r(e)}},!1),66639,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),i=e.i(61916),o=e.i(74677),s=e.i(69741),u=e.i(16795),l=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),m=e.i(74838),g=e.i(10372),R=e.i(93695),f=e.i(9580);e.i(52474);var w=e.i(220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/error-items/[id]/geogebra/route",pathname:"/api/error-items/[id]/geogebra",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/error-items/[id]/geogebra/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(81510),...{}}),{workAsyncStorage:b,workUnitAsyncStorage:E,serverHooks:C}=v;async function x(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let b="/api/error-items/[id]/geogebra/route";b=b.replace(/\/index$/,"")||"/";let E=await v.prepare(e,t,{srcPage:b,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:C,deploymentId:x,params:y,nextConfig:T,parsedUrl:A,isDraftMode:S,prerenderManifest:N,routerServerContext:I,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,resolvedPathname:P,clientReferenceManifest:_,serverActionsManifest:G}=E,H=(0,s.normalizeAppPath)(b),U=!!N.routes[P]&&(v.isDev||(0,f.isRouteCacheOwner)(P,v.cacheOwner,N.routes[P])),k=!!(N.dynamicRoutes[H]||U),j=async()=>((null==I?void 0:I.render404)?await I.render404(e,t,A,!1):t.end("This page could not be found"),null);if(k&&!S){let e=N.dynamicRoutes[H];if(e&&!1===e.fallback&&!U){if(T.adapterPath)return await j();throw new R.NoFallbackError}}let M=null;!k||v.isDev||S||(M="/index"===(M=P)?"/":M);let D=!0===v.isDev||!k,F=k&&!D;G&&_&&(0,o.setManifestsSingleton)({page:b,clientReferenceManifest:_,serverActionsManifest:G});let L=e.method||"GET",K=(0,i.getTracer)(),$=K.getActiveScopeSpan(),z=!!(null==I?void 0:I.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,T,N,B);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let W={params:y,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:S,supportsDynamicResponse:D,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,I)},sharedContext:{buildId:C,deploymentId:x}},X=new u.NodeNextRequest(e),J=new u.NodeNextResponse(t),Q=l.NextRequestAdapter.fromNodeNextRequest(X,(0,l.signalFromNodeResponse)(t)),Z=async({previousCacheEntry:r})=>{try{if(!B&&q&&O&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Q,W);e.fetchMetrics=W.renderOpts.fetchMetrics;let i=W.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let o=W.renderOpts.collectedTags;if(!k)return await (0,p.sendResponse)(X,J,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[g.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==W.renderOpts.collectedRevalidate&&!(W.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&W.renderOpts.collectedRevalidate,a=void 0===W.renderOpts.collectedExpire||W.renderOpts.collectedExpire>=g.INFINITE_CACHE?!1!==r&&r>0?T.expireTime:void 0:W.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:b,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:q})},!1,I),t}},Y=async(n,o)=>{try{var s,u;let n=await v.handleResponse({req:e,nextConfig:T,cacheKey:M,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,responseGenerator:Z,waitUntil:a.waitUntil,isMinimalMode:B});if(!k)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",q?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);B&&k||i.delete(g.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(X,J,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:q})},!1,I),k)throw t;await (0,p.sendResponse)(X,J,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||H,s=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",a),o.updateName(s))})()}};if(z&&$)await Y($,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${b}`,kind:i.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!z)}}e.s(["handler",0,x,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:E})},"routeModule",0,v,"serverHooks",0,C,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,E])}];
2
2
 
3
3
  //# sourceMappingURL=_1b0269x._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[14112,e=>e.a(async(t,a)=>{try{var r=e.i(89171),n=e.i(757660),i=e.i(79832),o=e.i(698043),s=e.i(258078),d=e.i(181912),l=e.i(50377),u=e.i(798003),c=e.i(376025),p=t([i]);[i]=p.then?(await p)():p;let m=(0,l.createLogger)("api:admin:dashboard");async function h(){let e=await (0,n.getServerSession)(i.authOptions);if(!(0,s.requireAdmin)(e))return(0,d.forbidden)("Admin access required");try{let e=await o.prisma.user.count(),t=await o.prisma.errorItem.count(),a=await o.prisma.practiceRecord.count(),n=await o.prisma.subject.count(),i=await o.prisma.user.findMany({orderBy:{createdAt:"desc"},select:{id:!0,name:!0,email:!0,role:!0,isActive:!0,createdAt:!0,educationStage:!0,enrollmentYear:!0,_count:{select:{errorItems:!0,practiceRecords:!0,subjects:!0}}}}),s=await o.prisma.subject.findMany({select:{name:!0,_count:{select:{errorItems:!0}}},orderBy:{errorItems:{_count:"desc"}}}),d=new Date,l=(0,u.getAppTimeZone)(),p=(0,c.getDayRange)(d,l,-6).start,h=await o.prisma.errorItem.groupBy({by:["createdAt"],where:{createdAt:{gte:p}},_count:{id:!0}}),m=[];for(let e=6;e>=0;e--){let t=(0,c.formatDateTime)((0,c.getDayRange)(d,l,-e).start,"yyyy-MM-dd",l);m.push({date:t,count:0})}for(let e of h){let t=(0,c.formatDateTime)(e.createdAt,"yyyy-MM-dd",l),a=m.find(e=>e.date===t);a&&(a.count+=e._count.id)}let R=await o.prisma.errorItem.groupBy({by:["masteryLevel"],_count:{id:!0}}),v={new:R.find(e=>0===e.masteryLevel)?._count.id||0,reviewing:R.find(e=>1===e.masteryLevel)?._count.id||0,mastered:R.find(e=>2===e.masteryLevel)?._count.id||0};return r.NextResponse.json({overview:{totalUsers:e,totalErrorItems:t,totalPracticeRecords:a,totalSubjects:n},userStats:i.map(e=>({id:e.id,name:e.name,email:e.email,role:e.role,isActive:e.isActive,createdAt:e.createdAt,educationStage:e.educationStage,enrollmentYear:e.enrollmentYear,errorCount:e._count.errorItems,practiceCount:e._count.practiceRecords,notebookCount:e._count.subjects})),subjectDistribution:s.map(e=>({name:e.name,count:e._count.errorItems})),dailyTrend:m,masteryDistribution:v})}catch(e){return m.error({error:e},"Error fetching dashboard data"),(0,d.internalError)("Failed to fetch dashboard data")}}e.s(["GET",0,h]),a()}catch(e){a(e)}},!1),980393,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),n=e.i(759756),i=e.i(561916),o=e.i(174677),s=e.i(869741),d=e.i(316795),l=e.i(487718),u=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),m=e.i(626937),R=e.i(10372),v=e.i(193695),g=e.i(509580);e.i(52474);var f=e.i(600220);let w=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/admin/dashboard/route",pathname:"/api/admin/dashboard",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/admin/dashboard/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(14112),...{}}),{workAsyncStorage:y,workUnitAsyncStorage:A,serverHooks:E}=w;async function C(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),w.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/admin/dashboard/route";y=y.replace(/\/index$/,"")||"/";let A=await w.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!A)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:E,deploymentId:C,params:b,nextConfig:x,parsedUrl:_,isDraftMode:T,prerenderManifest:S,routerServerContext:P,isOnDemandRevalidate:I,revalidateOnlyGenerated:N,resolvedPathname:O,clientReferenceManifest:M,serverActionsManifest:q}=A,D=(0,s.normalizeAppPath)(y),H=!!S.routes[O]&&(w.isDev||(0,g.isRouteCacheOwner)(O,w.cacheOwner,S.routes[O])),U=!!(S.dynamicRoutes[D]||H),k=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,_,!1):t.end("This page could not be found"),null);if(U&&!T){let e=S.dynamicRoutes[D];if(e&&!1===e.fallback&&!H){if(x.adapterPath)return await k();throw new v.NoFallbackError}}let j=null;!U||w.isDev||T||(j="/index"===(j=O)?"/":j);let L=!0===w.isDev||!U,B=U&&!L;q&&M&&(0,o.setManifestsSingleton)({page:y,clientReferenceManifest:M,serverActionsManifest:q});let F=e.method||"GET",K=(0,i.getTracer)(),$=K.getActiveScopeSpan(),G=!!(null==P?void 0:P.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),X=(0,n.getRequestMeta)(e,"incrementalCache")||await w.getIncrementalCache(e,x,S,V);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let Y={params:b,previewProps:S.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:L,incrementalCache:X,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>w.onRequestError(e,t,r,n,P)},sharedContext:{buildId:E,deploymentId:C}},W=new d.NodeNextRequest(e),Z=new d.NodeNextResponse(t),z=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!V&&I&&N&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await w.handle(z,Y);e.fetchMetrics=Y.renderOpts.fetchMetrics;let i=Y.renderOpts.pendingWaitUntil;i&&r.waitUntil&&(r.waitUntil(i),i=void 0);let o=Y.renderOpts.collectedTags;if(!U)return await (0,p.sendResponse)(W,Z,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[R.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==Y.renderOpts.collectedRevalidate&&!(Y.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&Y.renderOpts.collectedRevalidate,r=void 0===Y.renderOpts.collectedExpire||Y.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:Y.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await w.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:B,isOnDemandRevalidate:I})},!1,P),t}},Q=async(n,o)=>{try{var s,d;let n=await w.handleResponse({req:e,nextConfig:x,cacheKey:j,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:S,isRoutePPREnabled:!1,isOnDemandRevalidate:I,revalidateOnlyGenerated:N,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:V});if(!U)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(d=n.value)?void 0:d.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",I?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&U||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,Z,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await w.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:B,isOnDemandRevalidate:I})},!1,P),U)throw t;await (0,p.sendResponse)(W,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=K.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==u.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,s=`${F} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",r),o.updateName(s))})()}};if(G&&$)await Q($,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(u.BaseServerSpan.handleRequest,{spanName:`${F} ${y}`,kind:i.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>Q(e,t)),void 0,!G)}}e.s(["handler",0,C,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:y,workUnitAsyncStorage:A})},"routeModule",0,w,"serverHooks",0,E,"workAsyncStorage",0,y,"workUnitAsyncStorage",0,A])}];
1
+ module.exports=[14112,e=>e.a(async(t,a)=>{try{var r=e.i(58821),n=e.i(13618),i=e.i(79832),o=e.i(98043),s=e.i(58078),d=e.i(76759),l=e.i(95886),u=e.i(50377),c=e.i(98003),p=e.i(76025),h=t([i]);[i]=h.then?(await h)():h;let R=(0,u.createLogger)("api:admin:dashboard");async function m(){let e=await (0,n.getServerSession)(i.authOptions);if(!(0,s.requireAdmin)(e))return(0,d.forbidden)("Admin access required");try{let e=await o.prisma.user.count(),t=await o.prisma.errorItem.count(),a=await o.prisma.practiceRecord.count(),n=await o.prisma.subject.count(),i=await o.prisma.user.findMany({orderBy:{createdAt:"desc"},select:{id:!0,name:!0,email:!0,role:!0,isActive:!0,createdAt:!0,educationStage:!0,enrollmentYear:!0,_count:{select:{errorItems:!0,practiceRecords:!0,subjects:!0}}}}),s=await o.prisma.subject.findMany({select:{name:!0,_count:{select:{errorItems:!0}}},orderBy:{errorItems:{_count:"desc"}}}),d=new Date,u=(0,c.getAppTimeZone)(),h=(0,p.getDayRange)(d,u,-6).start,m=await o.prisma.errorItem.groupBy({by:["createdAt"],where:{createdAt:{gte:h}},_count:{id:!0}}),R=[];for(let e=6;e>=0;e--){let t=(0,p.formatDateTime)((0,p.getDayRange)(d,u,-e).start,"yyyy-MM-dd",u);R.push({date:t,count:0})}for(let e of m){let t=(0,p.formatDateTime)(e.createdAt,"yyyy-MM-dd",u),a=R.find(e=>e.date===t);a&&(a.count+=e._count.id)}let v=await (0,l.countByMasteryStatus)();return r.NextResponse.json({overview:{totalUsers:e,totalErrorItems:t,totalPracticeRecords:a,totalSubjects:n},userStats:i.map(e=>({id:e.id,name:e.name,email:e.email,role:e.role,isActive:e.isActive,createdAt:e.createdAt,educationStage:e.educationStage,enrollmentYear:e.enrollmentYear,errorCount:e._count.errorItems,practiceCount:e._count.practiceRecords,notebookCount:e._count.subjects})),subjectDistribution:s.map(e=>({name:e.name,count:e._count.errorItems})),dailyTrend:R,masteryDistribution:v})}catch(e){return R.error({error:e},"Error fetching dashboard data"),(0,d.internalError)("Failed to fetch dashboard data")}}e.s(["GET",0,m]),a()}catch(e){a(e)}},!1),80393,e=>{"use strict";var t=e.i(47909),a=e.i(74017),r=e.i(96250),n=e.i(59756),i=e.i(61916),o=e.i(74677),s=e.i(69741),d=e.i(16795),l=e.i(87718),u=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),m=e.i(74838),R=e.i(10372),v=e.i(93695),g=e.i(9580);e.i(52474);var f=e.i(220);let w=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/admin/dashboard/route",pathname:"/api/admin/dashboard",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/admin/dashboard/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(14112),...{}}),{workAsyncStorage:y,workUnitAsyncStorage:A,serverHooks:E}=w;async function C(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),w.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/admin/dashboard/route";y=y.replace(/\/index$/,"")||"/";let A=await w.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!A)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:E,deploymentId:C,params:b,nextConfig:x,parsedUrl:T,isDraftMode:S,prerenderManifest:_,routerServerContext:P,isOnDemandRevalidate:N,revalidateOnlyGenerated:I,resolvedPathname:O,clientReferenceManifest:M,serverActionsManifest:q}=A,D=(0,s.normalizeAppPath)(y),H=!!_.routes[O]&&(w.isDev||(0,g.isRouteCacheOwner)(O,w.cacheOwner,_.routes[O])),U=!!(_.dynamicRoutes[D]||H),k=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,T,!1):t.end("This page could not be found"),null);if(U&&!S){let e=_.dynamicRoutes[D];if(e&&!1===e.fallback&&!H){if(x.adapterPath)return await k();throw new v.NoFallbackError}}let j=null;!U||w.isDev||S||(j="/index"===(j=O)?"/":j);let B=!0===w.isDev||!U,F=U&&!B;q&&M&&(0,o.setManifestsSingleton)({page:y,clientReferenceManifest:M,serverActionsManifest:q});let K=e.method||"GET",L=(0,i.getTracer)(),$=L.getActiveScopeSpan(),G=!!(null==P?void 0:P.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),X=(0,n.getRequestMeta)(e,"incrementalCache")||await w.getIncrementalCache(e,x,_,V);null==X||X.resetRequestCache(),globalThis.__incrementalCache=X;let Y={params:b,previewProps:_.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:S,supportsDynamicResponse:B,incrementalCache:X,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>w.onRequestError(e,t,r,n,P)},sharedContext:{buildId:E,deploymentId:C}},W=new d.NodeNextRequest(e),Z=new d.NodeNextResponse(t),z=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!V&&N&&I&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await w.handle(z,Y);e.fetchMetrics=Y.renderOpts.fetchMetrics;let i=Y.renderOpts.pendingWaitUntil;i&&r.waitUntil&&(r.waitUntil(i),i=void 0);let o=Y.renderOpts.collectedTags;if(!U)return await (0,p.sendResponse)(W,Z,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[R.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==Y.renderOpts.collectedRevalidate&&!(Y.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&Y.renderOpts.collectedRevalidate,r=void 0===Y.renderOpts.collectedExpire||Y.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:Y.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await w.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:N})},!1,P),t}},Q=async(n,o)=>{try{var s,d;let n=await w.handleResponse({req:e,nextConfig:x,cacheKey:j,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:_,isRoutePPREnabled:!1,isOnDemandRevalidate:N,revalidateOnlyGenerated:I,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:V});if(!U)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(d=n.value)?void 0:d.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",N?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&U||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,Z,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof v.NoFallbackError||await w.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:N})},!1,P),U)throw t;await (0,p.sendResponse)(W,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=L.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==u.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,s=`${K} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",r),o.updateName(s))})()}};if(G&&$)await Q($,void 0);else{let t=L.getActiveScopeSpan();await L.withPropagatedContext(e.headers,()=>L.trace(u.BaseServerSpan.handleRequest,{spanName:`${K} ${y}`,kind:i.SpanKind.SERVER,attributes:{"http.method":K,"http.target":e.url}},e=>Q(e,t)),void 0,!G)}}e.s(["handler",0,C,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:y,workUnitAsyncStorage:A})},"routeModule",0,w,"serverHooks",0,E,"workAsyncStorage",0,y,"workUnitAsyncStorage",0,A])}];
2
2
 
3
3
  //# sourceMappingURL=_1b7qjlv._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[706162,e=>e.a(async(t,r)=>{try{var a=e.i(89171),n=e.i(698043),i=e.i(79832),o=e.i(757660),s=e.i(181912),u=e.i(50377),l=e.i(668426),d=t([i]);[i]=d.then?(await d)():d;let h=(0,u.createLogger)("api:notebooks");async function c(){let e=await (0,o.getServerSession)(i.authOptions);try{let t;if(e?.user?.email&&(t=await n.prisma.user.findUnique({where:{email:e.user.email}})),!t)return(0,s.unauthorized)("Authentication required");let r=await n.prisma.subject.findMany({where:{userId:t.id},include:{_count:{select:{errorItems:!0}}},orderBy:{createdAt:"desc"}});if(0===r.length){let e=(0,l.stageFromEducationStage)(t.educationStage),a=[{name:"数学",subjectKey:"math"},{name:"英语",subjectKey:"english"}].filter(t=>l.STAGE_SUBJECTS[e].includes(t.subjectKey));await Promise.all(a.map(({name:r,subjectKey:a})=>n.prisma.subject.create({data:{name:r,stage:e,subjectKey:a,userId:t.id}}))),r=await n.prisma.subject.findMany({where:{userId:t.id},include:{_count:{select:{errorItems:!0}}},orderBy:{createdAt:"desc"}})}return a.NextResponse.json(r)}catch(e){return h.error({error:e},"Error fetching notebooks"),(0,s.internalError)("Failed to fetch notebooks")}}async function p(e){let t=await (0,o.getServerSession)(i.authOptions);try{let r;if(t?.user?.email&&(r=await n.prisma.user.findUnique({where:{email:t.user.email}})),!r)return(0,s.unauthorized)("Authentication required");let{name:i,stage:o,subjectKey:u}=await e.json();if("string"!=typeof i||!i.trim())return(0,s.badRequest)("Notebook name is required");if(!(0,l.isValidNotebookScope)(o,u))return(0,s.badRequest)("A valid stage and subject are required");if(await n.prisma.subject.findUnique({where:{name_userId:{name:i.trim(),userId:r.id}}}))return(0,s.conflict)("Notebook with this name already exists");let d=await n.prisma.subject.create({data:{name:i.trim(),stage:o,subjectKey:u,userId:r.id},include:{_count:{select:{errorItems:!0}}}});return a.NextResponse.json(d,{status:201})}catch(e){return h.error({error:e},"Error creating notebook"),(0,s.internalError)("Failed to create notebook")}}e.s(["GET",0,c,"POST",0,p]),r()}catch(e){r(e)}},!1),608355,e=>{"use strict";var t=e.i(747909),r=e.i(174017),a=e.i(996250),n=e.i(759756),i=e.i(561916),o=e.i(174677),s=e.i(869741),u=e.i(316795),l=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),m=e.i(626937),R=e.i(10372),f=e.i(193695),v=e.i(509580);e.i(52474);var w=e.i(600220);let g=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/notebooks/route",pathname:"/api/notebooks",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/notebooks/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(706162),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:b,serverHooks:y}=g;async function C(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),g.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/notebooks/route";E=E.replace(/\/index$/,"")||"/";let b=await g.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!b)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:C,params:A,nextConfig:x,parsedUrl:S,isDraftMode:T,prerenderManifest:N,routerServerContext:q,isOnDemandRevalidate:P,revalidateOnlyGenerated:_,resolvedPathname:I,clientReferenceManifest:O,serverActionsManifest:k}=b,j=(0,s.normalizeAppPath)(E),H=!!N.routes[I]&&(g.isDev||(0,v.isRouteCacheOwner)(I,g.cacheOwner,N.routes[I])),U=!!(N.dynamicRoutes[j]||H),M=async()=>((null==q?void 0:q.render404)?await q.render404(e,t,S,!1):t.end("This page could not be found"),null);if(U&&!T){let e=N.dynamicRoutes[j];if(e&&!1===e.fallback&&!H){if(x.adapterPath)return await M();throw new f.NoFallbackError}}let D=null;!U||g.isDev||T||(D="/index"===(D=I)?"/":D);let F=!0===g.isDev||!U,K=U&&!F;k&&O&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:O,serverActionsManifest:k});let B=e.method||"GET",L=(0,i.getTracer)(),G=L.getActiveScopeSpan(),$=!!(null==q?void 0:q.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),z=(0,n.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,x,N,V);null==z||z.resetRequestCache(),globalThis.__incrementalCache=z;let X={params:A,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:F,incrementalCache:z,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>g.onRequestError(e,t,a,n,q)},sharedContext:{buildId:y,deploymentId:C}},W=new u.NodeNextRequest(e),J=new u.NodeNextResponse(t),Z=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!V&&P&&_&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await g.handle(Z,X);e.fetchMetrics=X.renderOpts.fetchMetrics;let i=X.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let o=X.renderOpts.collectedTags;if(!U)return await (0,p.sendResponse)(W,J,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[R.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==X.renderOpts.collectedRevalidate&&!(X.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&X.renderOpts.collectedRevalidate,a=void 0===X.renderOpts.collectedExpire||X.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?x.expireTime:void 0:X.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:P})},!1,q),t}},Y=async(n,o)=>{try{var s,u;let n=await g.handleResponse({req:e,nextConfig:x,cacheKey:D,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:_,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:V});if(!U)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",P?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&U||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,J,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof f.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:j,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:P})},!1,q),U)throw t;await (0,p.sendResponse)(W,J,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=L.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||j,s=`${B} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",a),o.updateName(s))})()}};if($&&G)await Y(G,void 0);else{let t=L.getActiveScopeSpan();await L.withPropagatedContext(e.headers,()=>L.trace(d.BaseServerSpan.handleRequest,{spanName:`${B} ${E}`,kind:i.SpanKind.SERVER,attributes:{"http.method":B,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,C,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:b})},"routeModule",0,g,"serverHooks",0,y,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,b])}];
1
+ module.exports=[6162,e=>e.a(async(t,r)=>{try{var a=e.i(58821),n=e.i(98043),i=e.i(79832),o=e.i(13618),s=e.i(76759),u=e.i(50377),l=e.i(68426),d=t([i]);[i]=d.then?(await d)():d;let h=(0,u.createLogger)("api:notebooks");async function c(){let e=await (0,o.getServerSession)(i.authOptions);try{let t;if(e?.user?.email&&(t=await n.prisma.user.findUnique({where:{email:e.user.email}})),!t)return(0,s.unauthorized)("Authentication required");let r=await n.prisma.subject.findMany({where:{userId:t.id},include:{_count:{select:{errorItems:!0}}},orderBy:{createdAt:"desc"}});if(0===r.length){let e=(0,l.stageFromEducationStage)(t.educationStage),a=[{name:"数学",subjectKey:"math"},{name:"英语",subjectKey:"english"}].filter(t=>l.STAGE_SUBJECTS[e].includes(t.subjectKey));await Promise.all(a.map(({name:r,subjectKey:a})=>n.prisma.subject.create({data:{name:r,stage:e,subjectKey:a,userId:t.id}}))),r=await n.prisma.subject.findMany({where:{userId:t.id},include:{_count:{select:{errorItems:!0}}},orderBy:{createdAt:"desc"}})}return a.NextResponse.json(r)}catch(e){return h.error({error:e},"Error fetching notebooks"),(0,s.internalError)("Failed to fetch notebooks")}}async function p(e){let t=await (0,o.getServerSession)(i.authOptions);try{let r;if(t?.user?.email&&(r=await n.prisma.user.findUnique({where:{email:t.user.email}})),!r)return(0,s.unauthorized)("Authentication required");let{name:i,stage:o,subjectKey:u}=await e.json();if("string"!=typeof i||!i.trim())return(0,s.badRequest)("Notebook name is required");if(!(0,l.isValidNotebookScope)(o,u))return(0,s.badRequest)("A valid stage and subject are required");if(await n.prisma.subject.findUnique({where:{name_userId:{name:i.trim(),userId:r.id}}}))return(0,s.conflict)("Notebook with this name already exists");let d=await n.prisma.subject.create({data:{name:i.trim(),stage:o,subjectKey:u,userId:r.id},include:{_count:{select:{errorItems:!0}}}});return a.NextResponse.json(d,{status:201})}catch(e){return h.error({error:e},"Error creating notebook"),(0,s.internalError)("Failed to create notebook")}}e.s(["GET",0,c,"POST",0,p]),r()}catch(e){r(e)}},!1),8355,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),i=e.i(61916),o=e.i(74677),s=e.i(69741),u=e.i(16795),l=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),m=e.i(74838),R=e.i(10372),f=e.i(93695),v=e.i(9580);e.i(52474);var w=e.i(220);let g=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/notebooks/route",pathname:"/api/notebooks",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/notebooks/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(6162),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:b,serverHooks:y}=g;async function C(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),g.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/notebooks/route";E=E.replace(/\/index$/,"")||"/";let b=await g.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!b)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:C,params:A,nextConfig:x,parsedUrl:S,isDraftMode:T,prerenderManifest:N,routerServerContext:q,isOnDemandRevalidate:P,revalidateOnlyGenerated:_,resolvedPathname:I,clientReferenceManifest:O,serverActionsManifest:k}=b,j=(0,s.normalizeAppPath)(E),H=!!N.routes[I]&&(g.isDev||(0,v.isRouteCacheOwner)(I,g.cacheOwner,N.routes[I])),U=!!(N.dynamicRoutes[j]||H),M=async()=>((null==q?void 0:q.render404)?await q.render404(e,t,S,!1):t.end("This page could not be found"),null);if(U&&!T){let e=N.dynamicRoutes[j];if(e&&!1===e.fallback&&!H){if(x.adapterPath)return await M();throw new f.NoFallbackError}}let D=null;!U||g.isDev||T||(D="/index"===(D=I)?"/":D);let F=!0===g.isDev||!U,K=U&&!F;k&&O&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:O,serverActionsManifest:k});let B=e.method||"GET",L=(0,i.getTracer)(),G=L.getActiveScopeSpan(),$=!!(null==q?void 0:q.isWrappedByNextServer),V=!!(0,n.getRequestMeta)(e,"minimalMode"),z=(0,n.getRequestMeta)(e,"incrementalCache")||await g.getIncrementalCache(e,x,N,V);null==z||z.resetRequestCache(),globalThis.__incrementalCache=z;let X={params:A,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:F,incrementalCache:z,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>g.onRequestError(e,t,a,n,q)},sharedContext:{buildId:y,deploymentId:C}},W=new u.NodeNextRequest(e),J=new u.NodeNextResponse(t),Z=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!V&&P&&_&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await g.handle(Z,X);e.fetchMetrics=X.renderOpts.fetchMetrics;let i=X.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let o=X.renderOpts.collectedTags;if(!U)return await (0,p.sendResponse)(W,J,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[R.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==X.renderOpts.collectedRevalidate&&!(X.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&X.renderOpts.collectedRevalidate,a=void 0===X.renderOpts.collectedExpire||X.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?x.expireTime:void 0:X.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await g.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:P})},!1,q),t}},Y=async(n,o)=>{try{var s,u;let n=await g.handleResponse({req:e,nextConfig:x,cacheKey:D,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:_,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:V});if(!U)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});V||t.setHeader("x-nextjs-cache",P?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);V&&U||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(W,J,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof f.NoFallbackError||await g.onRequestError(e,t,{routerKind:"App Router",routePath:j,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:K,isOnDemandRevalidate:P})},!1,q),U)throw t;await (0,p.sendResponse)(W,J,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=L.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||j,s=`${B} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",a),o.updateName(s))})()}};if($&&G)await Y(G,void 0);else{let t=L.getActiveScopeSpan();await L.withPropagatedContext(e.headers,()=>L.trace(d.BaseServerSpan.handleRequest,{spanName:`${B} ${E}`,kind:i.SpanKind.SERVER,attributes:{"http.method":B,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,C,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:b})},"routeModule",0,g,"serverHooks",0,y,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,b])}];
2
2
 
3
3
  //# sourceMappingURL=_1be-y66._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[802875,e=>e.a(async(t,r)=>{try{var a=e.i(89171),n=e.i(469719),i=e.i(698043),s=e.i(63856),o=e.i(181912),u=e.i(50377),l=e.i(874866),d=e.i(798003),c=e.i(376025),p=t([s]);[s]=p.then?(await p)():p;let R=(0,u.createLogger)("api:exams"),g=n.z.object({subjectIds:n.z.array(n.z.string().min(1)).min(1).max(50),tagNames:n.z.array(n.z.string().trim().min(1)).max(50).optional(),scope:n.z.enum(l.EXAM_SCOPES),count:n.z.number().int().min(1).max(l.MAX_EXAM_QUESTIONS),pickRule:n.z.enum(l.EXAM_PICK_RULES).default(l.DEFAULT_EXAM_PICK_RULE),difficulty:n.z.enum(l.EXAM_DIFFICULTIES),title:n.z.string().trim().max(100).optional(),language:n.z.enum(["zh","en"]).optional()});async function h(){try{let e=await (0,s.getCurrentUser)();if(!e)return(0,o.unauthorized)("Authentication required");let t=await i.prisma.examPaper.findMany({where:{userId:e.id},orderBy:{createdAt:"desc"},select:{id:!0,title:!0,status:!0,scope:!0,difficulty:!0,requestedCount:!0,resultsRecordedAt:!0,createdAt:!0,questions:{select:{status:!0,_count:{select:{practiceRecords:!0}}}}}});return a.NextResponse.json(t.map(({questions:e,...t})=>({...t,questionCount:e.length,readyCount:e.filter(e=>"ready"===e.status).length,recordedCount:e.filter(e=>e._count.practiceRecords>0).length})))}catch(e){return R.error({error:e},"Error listing exam papers"),(0,o.internalError)("Failed to list exam papers")}}async function m(e){try{let t=await (0,s.getCurrentUser)();if(!t)return(0,o.unauthorized)("Authentication required");let r=g.safeParse(await e.json());if(!r.success)return(0,o.validationError)("Invalid exam options",r.error.issues);let{subjectIds:n,tagNames:u,scope:p,count:h,pickRule:m,difficulty:E,language:f}=r.data,v=await i.prisma.subject.findMany({where:{id:{in:n},userId:t.id},select:{id:!0,name:!0}});if(0===v.length)return(0,o.badRequest)("NO_SOURCE_ITEMS");let C=await (0,l.selectSourceItems)(t.id,{subjectIds:v.map(e=>e.id),tagNames:u,scope:p,count:h,pickRule:m});if(0===C.length)return(0,o.badRequest)("NO_SOURCE_ITEMS");let x=r.data.title||`${v.map(e=>e.name).join("、")} ${(0,c.formatDateTime)(new Date,"yyyy-MM-dd HH:mm",(0,d.getAppTimeZone)())}`,w=await i.prisma.examPaper.create({data:{userId:t.id,title:x,scope:p,difficulty:E,requestedCount:h,subjectIds:JSON.stringify(v.map(e=>e.id)),tagNames:u&&u.length>0?JSON.stringify(u):null,questions:{create:C.map((e,t)=>({order:t+1,errorItemId:e.id,sourceShortId:e.shortId}))}},select:{id:!0,title:!0,requestedCount:!0,_count:{select:{questions:!0}}}});return(0,l.generateExamPaper)(w.id,f||"zh"),R.info({paperId:w.id,count:C.length,requested:h},"Exam paper created"),a.NextResponse.json({id:w.id,title:w.title,requestedCount:w.requestedCount,questionCount:w._count.questions},{status:201})}catch(e){return R.error({error:e},"Error creating exam paper"),(0,o.internalError)("Failed to create exam paper")}}e.s(["GET",0,h,"POST",0,m]),r()}catch(e){r(e)}},!1),909726,e=>{"use strict";var t=e.i(747909),r=e.i(174017),a=e.i(996250),n=e.i(759756),i=e.i(561916),s=e.i(174677),o=e.i(869741),u=e.i(316795),l=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),m=e.i(626937),R=e.i(10372),g=e.i(193695),E=e.i(509580);e.i(52474);var f=e.i(600220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/exams/route",pathname:"/api/exams",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/exams/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(802875),...{}}),{workAsyncStorage:C,workUnitAsyncStorage:x,serverHooks:w}=v;async function y(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let C="/api/exams/route";C=C.replace(/\/index$/,"")||"/";let x=await v.prepare(e,t,{srcPage:C,multiZoneDraftMode:!1});if(!x)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:w,deploymentId:y,params:A,nextConfig:S,parsedUrl:T,isDraftMode:_,prerenderManifest:I,routerServerContext:q,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,resolvedPathname:b,clientReferenceManifest:O,serverActionsManifest:M}=x,U=(0,o.normalizeAppPath)(C),H=!!I.routes[b]&&(v.isDev||(0,E.isRouteCacheOwner)(b,v.cacheOwner,I.routes[b])),D=!!(I.dynamicRoutes[U]||H),j=async()=>((null==q?void 0:q.render404)?await q.render404(e,t,T,!1):t.end("This page could not be found"),null);if(D&&!_){let e=I.dynamicRoutes[U];if(e&&!1===e.fallback&&!H){if(S.adapterPath)return await j();throw new g.NoFallbackError}}let z=null;!D||v.isDev||_||(z="/index"===(z=b)?"/":z);let k=!0===v.isDev||!D,F=D&&!k;M&&O&&(0,s.setManifestsSingleton)({page:C,clientReferenceManifest:O,serverActionsManifest:M});let L=e.method||"GET",K=(0,i.getTracer)(),X=K.getActiveScopeSpan(),$=!!(null==q?void 0:q.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),G=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,S,I,B);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let V={params:A,previewProps:I.preview,renderOpts:{experimental:{authInterrupts:!!S.experimental.authInterrupts,useCacheTimeout:S.experimental.useCacheTimeout},cacheComponents:!!S.cacheComponents,validationLevel:S.experimental.instantInsights.validationLevel,isDraftMode:_,supportsDynamicResponse:k,incrementalCache:G,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:S.cacheLife,staticPageGenerationTimeout:S.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,q)},sharedContext:{buildId:w,deploymentId:y}},J=new u.NodeNextRequest(e),W=new u.NodeNextResponse(t),Z=l.NextRequestAdapter.fromNodeNextRequest(J,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!B&&P&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let i=V.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let s=V.renderOpts.collectedTags;if(!D)return await (0,p.sendResponse)(J,W,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[R.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,a=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?S.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:C,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:P})},!1,q),t}},Y=async(n,s)=>{try{var o,u;let n=await v.handleResponse({req:e,nextConfig:S,cacheKey:z,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:I,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:B});if(!D)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",P?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),_&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);B&&D||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(J,W,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof g.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:P})},!1,q),D)throw t;await (0,p.sendResponse)(J,W,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||U,o=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),s&&s!==n&&(s.setAttribute("http.route",a),s.updateName(o))})()}};if($&&X)await Y(X,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${C}`,kind:i.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:C,workUnitAsyncStorage:x})},"routeModule",0,v,"serverHooks",0,w,"workAsyncStorage",0,C,"workUnitAsyncStorage",0,x])}];
1
+ module.exports=[2875,e=>e.a(async(t,r)=>{try{var a=e.i(58821),n=e.i(69719),i=e.i(98043),s=e.i(63856),o=e.i(76759),u=e.i(50377),l=e.i(74866),d=e.i(98003),c=e.i(76025),p=t([s]);[s]=p.then?(await p)():p;let R=(0,u.createLogger)("api:exams"),g=n.z.object({subjectIds:n.z.array(n.z.string().min(1)).min(1).max(50),tagNames:n.z.array(n.z.string().trim().min(1)).max(50).optional(),scope:n.z.enum(l.EXAM_SCOPES),count:n.z.number().int().min(1).max(l.MAX_EXAM_QUESTIONS),pickRule:n.z.enum(l.EXAM_PICK_RULES).default(l.DEFAULT_EXAM_PICK_RULE),difficulty:n.z.enum(l.EXAM_DIFFICULTIES),title:n.z.string().trim().max(100).optional(),language:n.z.enum(["zh","en"]).optional()});async function h(){try{let e=await (0,s.getCurrentUser)();if(!e)return(0,o.unauthorized)("Authentication required");let t=await i.prisma.examPaper.findMany({where:{userId:e.id},orderBy:{createdAt:"desc"},select:{id:!0,title:!0,status:!0,scope:!0,difficulty:!0,requestedCount:!0,resultsRecordedAt:!0,createdAt:!0,questions:{select:{status:!0,_count:{select:{practiceRecords:!0}}}}}});return a.NextResponse.json(t.map(({questions:e,...t})=>({...t,questionCount:e.length,readyCount:e.filter(e=>"ready"===e.status).length,recordedCount:e.filter(e=>e._count.practiceRecords>0).length})))}catch(e){return R.error({error:e},"Error listing exam papers"),(0,o.internalError)("Failed to list exam papers")}}async function m(e){try{let t=await (0,s.getCurrentUser)();if(!t)return(0,o.unauthorized)("Authentication required");let r=g.safeParse(await e.json());if(!r.success)return(0,o.validationError)("Invalid exam options",r.error.issues);let{subjectIds:n,tagNames:u,scope:p,count:h,pickRule:m,difficulty:E,language:f}=r.data,v=await i.prisma.subject.findMany({where:{id:{in:n},userId:t.id},select:{id:!0,name:!0}});if(0===v.length)return(0,o.badRequest)("NO_SOURCE_ITEMS");let C=await (0,l.selectSourceItems)(t.id,{subjectIds:v.map(e=>e.id),tagNames:u,scope:p,count:h,pickRule:m});if(0===C.length)return(0,o.badRequest)("NO_SOURCE_ITEMS");let x=r.data.title||`${v.map(e=>e.name).join("、")} ${(0,c.formatDateTime)(new Date,"yyyy-MM-dd HH:mm",(0,d.getAppTimeZone)())}`,w=await i.prisma.examPaper.create({data:{userId:t.id,title:x,scope:p,difficulty:E,requestedCount:h,subjectIds:JSON.stringify(v.map(e=>e.id)),tagNames:u&&u.length>0?JSON.stringify(u):null,questions:{create:C.map((e,t)=>({order:t+1,errorItemId:e.id,sourceShortId:e.shortId}))}},select:{id:!0,title:!0,requestedCount:!0,_count:{select:{questions:!0}}}});return(0,l.generateExamPaper)(w.id,f||"zh"),R.info({paperId:w.id,count:C.length,requested:h},"Exam paper created"),a.NextResponse.json({id:w.id,title:w.title,requestedCount:w.requestedCount,questionCount:w._count.questions},{status:201})}catch(e){return R.error({error:e},"Error creating exam paper"),(0,o.internalError)("Failed to create exam paper")}}e.s(["GET",0,h,"POST",0,m]),r()}catch(e){r(e)}},!1),9726,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),i=e.i(61916),s=e.i(74677),o=e.i(69741),u=e.i(16795),l=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),m=e.i(74838),R=e.i(10372),g=e.i(93695),E=e.i(9580);e.i(52474);var f=e.i(220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/exams/route",pathname:"/api/exams",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/exams/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(2875),...{}}),{workAsyncStorage:C,workUnitAsyncStorage:x,serverHooks:w}=v;async function y(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let C="/api/exams/route";C=C.replace(/\/index$/,"")||"/";let x=await v.prepare(e,t,{srcPage:C,multiZoneDraftMode:!1});if(!x)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:w,deploymentId:y,params:A,nextConfig:S,parsedUrl:T,isDraftMode:_,prerenderManifest:I,routerServerContext:q,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,resolvedPathname:b,clientReferenceManifest:O,serverActionsManifest:M}=x,U=(0,o.normalizeAppPath)(C),H=!!I.routes[b]&&(v.isDev||(0,E.isRouteCacheOwner)(b,v.cacheOwner,I.routes[b])),D=!!(I.dynamicRoutes[U]||H),j=async()=>((null==q?void 0:q.render404)?await q.render404(e,t,T,!1):t.end("This page could not be found"),null);if(D&&!_){let e=I.dynamicRoutes[U];if(e&&!1===e.fallback&&!H){if(S.adapterPath)return await j();throw new g.NoFallbackError}}let z=null;!D||v.isDev||_||(z="/index"===(z=b)?"/":z);let k=!0===v.isDev||!D,F=D&&!k;M&&O&&(0,s.setManifestsSingleton)({page:C,clientReferenceManifest:O,serverActionsManifest:M});let L=e.method||"GET",K=(0,i.getTracer)(),X=K.getActiveScopeSpan(),$=!!(null==q?void 0:q.isWrappedByNextServer),B=!!(0,n.getRequestMeta)(e,"minimalMode"),G=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,S,I,B);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let V={params:A,previewProps:I.preview,renderOpts:{experimental:{authInterrupts:!!S.experimental.authInterrupts,useCacheTimeout:S.experimental.useCacheTimeout},cacheComponents:!!S.cacheComponents,validationLevel:S.experimental.instantInsights.validationLevel,isDraftMode:_,supportsDynamicResponse:k,incrementalCache:G,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:S.cacheLife,staticPageGenerationTimeout:S.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,q)},sharedContext:{buildId:w,deploymentId:y}},J=new u.NodeNextRequest(e),W=new u.NodeNextResponse(t),Z=l.NextRequestAdapter.fromNodeNextRequest(J,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!B&&P&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(Z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let i=V.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let s=V.renderOpts.collectedTags;if(!D)return await (0,p.sendResponse)(J,W,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[R.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,a=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?S.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:C,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:P})},!1,q),t}},Y=async(n,s)=>{try{var o,u;let n=await v.handleResponse({req:e,nextConfig:S,cacheKey:z,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:I,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:N,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:B});if(!D)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(u=n.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",P?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),_&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);B&&D||i.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(J,W,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof g.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:P})},!1,q),D)throw t;await (0,p.sendResponse)(J,W,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=K.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||U,o=`${L} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),s&&s!==n&&(s.setAttribute("http.route",a),s.updateName(o))})()}};if($&&X)await Y(X,void 0);else{let t=K.getActiveScopeSpan();await K.withPropagatedContext(e.headers,()=>K.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${C}`,kind:i.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:C,workUnitAsyncStorage:x})},"routeModule",0,v,"serverHooks",0,w,"workAsyncStorage",0,C,"workUnitAsyncStorage",0,x])}];
2
2
 
3
3
  //# sourceMappingURL=_1ex6ovo._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[870322,e=>e.a(async(t,r)=>{try{var a=e.i(89171),n=e.i(757660),s=e.i(698043),i=e.i(79832),o=e.i(50377),l=t([i]);[i]=l.then?(await l)():l;let c=(0,o.createLogger)("api:tags");async function u(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:r}=new URL(e.url),o=r.get("subject"),l="true"===r.get("flat");if(!o)return a.NextResponse.json({error:"Subject is required"},{status:400});let u=await s.prisma.knowledgeTag.findMany({where:{subject:o,OR:[{isSystem:!0},{userId:t.user.id}]},orderBy:[{order:"asc"},{name:"asc"}]});if(l){let e=u.filter(e=>!u.some(t=>t.parentId===e.id));return a.NextResponse.json({tags:e.map(e=>{let t=e.parentId?u.find(t=>t.id===e.parentId):null;return{id:e.id,name:e.name,isSystem:e.isSystem,parentId:e.parentId,parentName:t?t.name:null}})})}let d=function(e){let t=new Map,r=[];for(let r of e)t.set(r.id,{id:r.id,name:r.name,code:r.code,isSystem:r.isSystem,children:[]});for(let a of e){let e=t.get(a.id);a.parentId&&t.has(a.parentId)?t.get(a.parentId).children.push(e):r.push(e)}return r}(u);return u.length>0&&c.debug({subject:o,totalTags:u.length,systemTags:u.filter(e=>e.isSystem).length,userTags:u.filter(e=>!e.isSystem).length,treeRoots:d.length,sampleRoot:d.length>0?d[0].name:"none"},"Returning tag tree"),a.NextResponse.json({tags:d})}catch(e){return c.error({error:e},"Error fetching tags"),a.NextResponse.json({error:"Failed to fetch tags"},{status:500})}}async function d(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{name:r,subject:o,parentId:l}=await e.json();if(!r||!o)return a.NextResponse.json({error:"Name and subject are required"},{status:400});if(await s.prisma.knowledgeTag.findFirst({where:{name:r.trim(),subject:o,userId:t.user.id,parentId:l||null}}))return a.NextResponse.json({error:"Tag already exists in this group"},{status:409});let u=await s.prisma.knowledgeTag.create({data:{name:r.trim(),subject:o,parentId:l||null,isSystem:!1,userId:t.user.id}});return a.NextResponse.json({tag:u},{status:201})}catch(e){return c.error({error:e},"Error creating tag"),a.NextResponse.json({error:"Failed to create tag"},{status:500})}}async function p(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:r}=new URL(e.url),o=r.get("id");if(!o)return a.NextResponse.json({error:"Tag ID is required"},{status:400});if(!await s.prisma.knowledgeTag.findFirst({where:{id:o,userId:t.user.id,isSystem:!1}}))return a.NextResponse.json({error:"Tag not found or not deletable"},{status:404});return await s.prisma.knowledgeTag.delete({where:{id:o}}),a.NextResponse.json({success:!0})}catch(e){return c.error({error:e},"Error deleting tag"),a.NextResponse.json({error:"Failed to delete tag"},{status:500})}}e.s(["DELETE",0,p,"GET",0,u,"POST",0,d]),r()}catch(e){r(e)}},!1),915984,e=>{"use strict";var t=e.i(747909),r=e.i(174017),a=e.i(996250),n=e.i(759756),s=e.i(561916),i=e.i(174677),o=e.i(869741),l=e.i(316795),u=e.i(487718),d=e.i(995169),p=e.i(47587),c=e.i(666012),h=e.i(570101),g=e.i(626937),R=e.i(10372),m=e.i(193695),f=e.i(509580);e.i(52474);var w=e.i(600220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/tags/route",pathname:"/api/tags",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/tags/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(870322),...{}}),{workAsyncStorage:x,workUnitAsyncStorage:E,serverHooks:y}=v;async function T(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let x="/api/tags/route";x=x.replace(/\/index$/,"")||"/";let E=await v.prepare(e,t,{srcPage:x,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:T,params:S,nextConfig:C,parsedUrl:N,isDraftMode:A,prerenderManifest:I,routerServerContext:b,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,resolvedPathname:j,clientReferenceManifest:q,serverActionsManifest:_}=E,U=(0,o.normalizeAppPath)(x),H=!!I.routes[j]&&(v.isDev||(0,f.isRouteCacheOwner)(j,v.cacheOwner,I.routes[j])),k=!!(I.dynamicRoutes[U]||H),M=async()=>((null==b?void 0:b.render404)?await b.render404(e,t,N,!1):t.end("This page could not be found"),null);if(k&&!A){let e=I.dynamicRoutes[U];if(e&&!1===e.fallback&&!H){if(C.adapterPath)return await M();throw new m.NoFallbackError}}let D=null;!k||v.isDev||A||(D="/index"===(D=j)?"/":D);let F=!0===v.isDev||!k,L=k&&!F;_&&q&&(0,i.setManifestsSingleton)({page:x,clientReferenceManifest:q,serverActionsManifest:_});let K=e.method||"GET",B=(0,s.getTracer)(),$=B.getActiveScopeSpan(),G=!!(null==b?void 0:b.isWrappedByNextServer),z=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,C,I,z);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let X={params:S,previewProps:I.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts,useCacheTimeout:C.experimental.useCacheTimeout},cacheComponents:!!C.cacheComponents,validationLevel:C.experimental.instantInsights.validationLevel,isDraftMode:A,supportsDynamicResponse:F,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:C.cacheLife,staticPageGenerationTimeout:C.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,b)},sharedContext:{buildId:y,deploymentId:T}},W=new l.NodeNextRequest(e),Z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!z&&O&&P&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(J,X);e.fetchMetrics=X.renderOpts.fetchMetrics;let s=X.renderOpts.pendingWaitUntil;s&&a.waitUntil&&(a.waitUntil(s),s=void 0);let i=X.renderOpts.collectedTags;if(!k)return await (0,c.sendResponse)(W,Z,n,s),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);i&&(t[R.NEXT_CACHE_TAGS_HEADER]=i),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==X.renderOpts.collectedRevalidate&&!(X.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&X.renderOpts.collectedRevalidate,a=void 0===X.renderOpts.collectedExpire||X.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?C.expireTime:void 0:X.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:x,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:L,isOnDemandRevalidate:O})},!1,b),t}},Y=async(n,i)=>{try{var o,l;let n=await v.handleResponse({req:e,nextConfig:C,cacheKey:D,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:I,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:z});if(!k)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});z||t.setHeader("x-nextjs-cache",O?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),A&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);z&&k||s.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,g.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(W,Z,new Response(n.value.body,{headers:s,status:n.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:L,isOnDemandRevalidate:O})},!1,b),k)throw t;await (0,c.sendResponse)(W,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:s.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=B.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||U,o=`${K} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),i&&i!==n&&(i.setAttribute("http.route",a),i.updateName(o))})()}};if(G&&$)await Y($,void 0);else{let t=B.getActiveScopeSpan();await B.withPropagatedContext(e.headers,()=>B.trace(d.BaseServerSpan.handleRequest,{spanName:`${K} ${x}`,kind:s.SpanKind.SERVER,attributes:{"http.method":K,"http.target":e.url}},e=>Y(e,t)),void 0,!G)}}e.s(["handler",0,T,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:x,workUnitAsyncStorage:E})},"routeModule",0,v,"serverHooks",0,y,"workAsyncStorage",0,x,"workUnitAsyncStorage",0,E])}];
1
+ module.exports=[70322,e=>e.a(async(t,r)=>{try{var a=e.i(58821),n=e.i(13618),s=e.i(98043),i=e.i(79832),o=e.i(50377),l=t([i]);[i]=l.then?(await l)():l;let c=(0,o.createLogger)("api:tags");async function u(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:r}=new URL(e.url),o=r.get("subject"),l="true"===r.get("flat");if(!o)return a.NextResponse.json({error:"Subject is required"},{status:400});let u=await s.prisma.knowledgeTag.findMany({where:{subject:o,OR:[{isSystem:!0},{userId:t.user.id}]},orderBy:[{order:"asc"},{name:"asc"}]});if(l){let e=u.filter(e=>!u.some(t=>t.parentId===e.id));return a.NextResponse.json({tags:e.map(e=>{let t=e.parentId?u.find(t=>t.id===e.parentId):null;return{id:e.id,name:e.name,isSystem:e.isSystem,parentId:e.parentId,parentName:t?t.name:null}})})}let d=function(e){let t=new Map,r=[];for(let r of e)t.set(r.id,{id:r.id,name:r.name,code:r.code,isSystem:r.isSystem,children:[]});for(let a of e){let e=t.get(a.id);a.parentId&&t.has(a.parentId)?t.get(a.parentId).children.push(e):r.push(e)}return r}(u);return u.length>0&&c.debug({subject:o,totalTags:u.length,systemTags:u.filter(e=>e.isSystem).length,userTags:u.filter(e=>!e.isSystem).length,treeRoots:d.length,sampleRoot:d.length>0?d[0].name:"none"},"Returning tag tree"),a.NextResponse.json({tags:d})}catch(e){return c.error({error:e},"Error fetching tags"),a.NextResponse.json({error:"Failed to fetch tags"},{status:500})}}async function d(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{name:r,subject:o,parentId:l}=await e.json();if(!r||!o)return a.NextResponse.json({error:"Name and subject are required"},{status:400});if(await s.prisma.knowledgeTag.findFirst({where:{name:r.trim(),subject:o,userId:t.user.id,parentId:l||null}}))return a.NextResponse.json({error:"Tag already exists in this group"},{status:409});let u=await s.prisma.knowledgeTag.create({data:{name:r.trim(),subject:o,parentId:l||null,isSystem:!1,userId:t.user.id}});return a.NextResponse.json({tag:u},{status:201})}catch(e){return c.error({error:e},"Error creating tag"),a.NextResponse.json({error:"Failed to create tag"},{status:500})}}async function p(e){try{let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.id)return a.NextResponse.json({error:"Unauthorized"},{status:401});let{searchParams:r}=new URL(e.url),o=r.get("id");if(!o)return a.NextResponse.json({error:"Tag ID is required"},{status:400});if(!await s.prisma.knowledgeTag.findFirst({where:{id:o,userId:t.user.id,isSystem:!1}}))return a.NextResponse.json({error:"Tag not found or not deletable"},{status:404});return await s.prisma.knowledgeTag.delete({where:{id:o}}),a.NextResponse.json({success:!0})}catch(e){return c.error({error:e},"Error deleting tag"),a.NextResponse.json({error:"Failed to delete tag"},{status:500})}}e.s(["DELETE",0,p,"GET",0,u,"POST",0,d]),r()}catch(e){r(e)}},!1),15984,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),s=e.i(61916),i=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),g=e.i(74838),R=e.i(10372),m=e.i(93695),f=e.i(9580);e.i(52474);var w=e.i(220);let v=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/tags/route",pathname:"/api/tags",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/tags/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(70322),...{}}),{workAsyncStorage:x,workUnitAsyncStorage:E,serverHooks:y}=v;async function T(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),v.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let x="/api/tags/route";x=x.replace(/\/index$/,"")||"/";let E=await v.prepare(e,t,{srcPage:x,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:T,params:S,nextConfig:C,parsedUrl:N,isDraftMode:A,prerenderManifest:I,routerServerContext:b,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,resolvedPathname:j,clientReferenceManifest:q,serverActionsManifest:_}=E,U=(0,o.normalizeAppPath)(x),H=!!I.routes[j]&&(v.isDev||(0,f.isRouteCacheOwner)(j,v.cacheOwner,I.routes[j])),k=!!(I.dynamicRoutes[U]||H),M=async()=>((null==b?void 0:b.render404)?await b.render404(e,t,N,!1):t.end("This page could not be found"),null);if(k&&!A){let e=I.dynamicRoutes[U];if(e&&!1===e.fallback&&!H){if(C.adapterPath)return await M();throw new m.NoFallbackError}}let D=null;!k||v.isDev||A||(D="/index"===(D=j)?"/":D);let F=!0===v.isDev||!k,L=k&&!F;_&&q&&(0,i.setManifestsSingleton)({page:x,clientReferenceManifest:q,serverActionsManifest:_});let K=e.method||"GET",B=(0,s.getTracer)(),$=B.getActiveScopeSpan(),G=!!(null==b?void 0:b.isWrappedByNextServer),z=!!(0,n.getRequestMeta)(e,"minimalMode"),V=(0,n.getRequestMeta)(e,"incrementalCache")||await v.getIncrementalCache(e,C,I,z);null==V||V.resetRequestCache(),globalThis.__incrementalCache=V;let X={params:S,previewProps:I.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts,useCacheTimeout:C.experimental.useCacheTimeout},cacheComponents:!!C.cacheComponents,validationLevel:C.experimental.instantInsights.validationLevel,isDraftMode:A,supportsDynamicResponse:F,incrementalCache:V,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:C.cacheLife,staticPageGenerationTimeout:C.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>v.onRequestError(e,t,a,n,b)},sharedContext:{buildId:y,deploymentId:T}},W=new l.NodeNextRequest(e),Z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(W,(0,u.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:r})=>{try{if(!z&&O&&P&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await v.handle(J,X);e.fetchMetrics=X.renderOpts.fetchMetrics;let s=X.renderOpts.pendingWaitUntil;s&&a.waitUntil&&(a.waitUntil(s),s=void 0);let i=X.renderOpts.collectedTags;if(!k)return await (0,c.sendResponse)(W,Z,n,s),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);i&&(t[R.NEXT_CACHE_TAGS_HEADER]=i),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==X.renderOpts.collectedRevalidate&&!(X.renderOpts.collectedRevalidate>=R.INFINITE_CACHE)&&X.renderOpts.collectedRevalidate,a=void 0===X.renderOpts.collectedExpire||X.renderOpts.collectedExpire>=R.INFINITE_CACHE?!1!==r&&r>0?C.expireTime:void 0:X.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await v.onRequestError(e,t,{routerKind:"App Router",routePath:x,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:L,isOnDemandRevalidate:O})},!1,b),t}},Y=async(n,i)=>{try{var o,l;let n=await v.handleResponse({req:e,nextConfig:C,cacheKey:D,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:I,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,responseGenerator:Q,waitUntil:a.waitUntil,isMinimalMode:z});if(!k)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});z||t.setHeader("x-nextjs-cache",O?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),A&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);z&&k||s.delete(R.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,g.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(W,Z,new Response(n.value.body,{headers:s,status:n.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await v.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:L,isOnDemandRevalidate:O})},!1,b),k)throw t;await (0,c.sendResponse)(W,Z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:s.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=B.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||U,o=`${K} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),i&&i!==n&&(i.setAttribute("http.route",a),i.updateName(o))})()}};if(G&&$)await Y($,void 0);else{let t=B.getActiveScopeSpan();await B.withPropagatedContext(e.headers,()=>B.trace(d.BaseServerSpan.handleRequest,{spanName:`${K} ${x}`,kind:s.SpanKind.SERVER,attributes:{"http.method":K,"http.target":e.url}},e=>Y(e,t)),void 0,!G)}}e.s(["handler",0,T,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:x,workUnitAsyncStorage:E})},"routeModule",0,v,"serverHooks",0,y,"workAsyncStorage",0,x,"workUnitAsyncStorage",0,E])}];
2
2
 
3
3
  //# sourceMappingURL=_1fgb9ve._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[710821,e=>e.a(async(t,r)=>{try{var a=e.i(89171),n=e.i(644950),i=e.i(698043),s=e.i(50377),o=e.i(926828),l=e.i(181912),u=e.i(539811),d=e.i(183508),c=e.i(204083),p=e.i(92366),h=e.i(404752),g=e.i(160979),m=e.i(999617),f=e.i(655920),w=e.i(798003),R=t([n]);[n]=R.then?(await R)():R;let y=(0,s.createLogger)("api:openclaw:batch-upload"),T=[".jpg",".jpeg",".png"];async function E(e,t,r){let a=process.env.OPENCLAW_API_URL||"http://localhost:8080",n=process.env.OPENCLAW_API_KEY||"",i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let r=await fetch(`${a}/api/recognize`,{method:"POST",headers:{"Content-Type":"application/json",...n?{Authorization:`Bearer ${n}`}:{}},body:JSON.stringify({image:e,mimeType:t}),signal:i.signal});if(clearTimeout(s),!r.ok){let e=await r.text();return y.error({status:r.status,error:e},"Openclaw agent error"),{success:!1,error:`识别服务异常: HTTP ${r.status}`}}return await r.json()}catch(e){if(clearTimeout(s),"AbortError"===e.name)return y.error("Openclaw agent timeout"),{success:!1,error:"识别服务超时"};return y.error({error:e?.message||String(e)},"Openclaw agent request failed"),{success:!1,error:`识别服务请求失败: ${e?.message||String(e)}`}}}async function v(e,t,r,a,n){let{questionText:i,answerText:s,analysis:o,knowledgePoints:l,errorType:R,source:E}=a||{},v=(0,m.parseDifficultyStars)(a?.difficultyStars),A={questionText:i,answerText:s,analysis:o,wrongAnswerText:a?.wrongAnswerText,mistakeAnalysis:a?.mistakeAnalysis,originalImageUrl:`data:${r};base64,${t}`},T=await (0,g.runQuestionImportTransaction)(async a=>{let h=await (0,g.findDuplicateQuestion)(a,e,A);if(h)return(0,g.recordDuplicateQuestion)(a,e,h,A);let m=Array.isArray(l)?l:[],T=[],I=n?await a.subject.findUnique({where:{id:n}}):null,C=I?(0,d.inferSubjectFromName)(I.name):null,O=await a.user.findUnique({where:{id:e},select:{educationStage:!0,enrollmentYear:!0}}),x=null;for(let t of(O?.educationStage&&O?.enrollmentYear&&(x=(0,u.calculateGrade)(O.educationStage,O.enrollmentYear,new Date,"en",(0,w.getAppTimeZone)())),m))try{let r=await a.knowledgeTag.findFirst({where:{name:t,OR:[{isSystem:!0},{userId:e}]}});if(!r){let n=x&&C?await (0,c.findParentTagIdForGrade)(x,C,a):null;r=await a.knowledgeTag.create({data:{name:t,subject:C||"other",isSystem:!1,userId:e,parentId:n||void 0}})}T.push({id:r.id})}catch(e){y.error({tagName:t,error:e},"Error processing tag")}return await a.errorItem.create({data:{shortId:await (0,p.generateUniqueShortId)(a),userId:e,subjectId:n||void 0,originalImageUrl:`data:${r};base64,${t}`,ocrText:i||null,questionText:i||null,answerText:s||null,analysis:o||null,knowledgePoints:JSON.stringify(m),gradeSemester:x,paperLevel:(0,f.getDefaultPaperLevel)(v),difficultyStars:v,errorType:R||null,source:E||"Openclaw",masteryLevel:0,tags:{connect:T}},include:{tags:!0,subject:!0}})});return"duplicate"in T&&T.duplicate&&(0,h.scheduleMasteryEvaluation)([T.id]),T}async function A(e){y.info("POST /api/openclaw/batch-upload called");let t=e.headers.get("x-api-key"),r=process.env.OPENCLAW_INTEGRATION_API_KEY,s=process.env.OPENCLAW_AUTH_MODE||"credentials",u=null,d=null,c=null,p=null;try{let h=await e.json();if("apikey"===s&&r){if(!t)return y.warn("Missing API key in request"),(0,l.createErrorResponse)("未提供API密钥",401,l.ErrorCode.UNAUTHORIZED,"Missing API key");if(t!==r)return y.warn("Invalid API key provided"),(0,l.createErrorResponse)("API密钥无效",401,l.ErrorCode.UNAUTHORIZED,"Invalid API key");d=h.userEmail,c=h.subjectId}else{let{username:e,password:t}=h;if(!e||!t)return(0,l.createErrorResponse)("请提供用户名和密码",401,l.ErrorCode.UNAUTHORIZED,"Missing username or password");if(!(u=await i.prisma.user.findFirst({where:{OR:[{email:e},{name:e}]}})))return y.warn({username:e},"User not found"),(0,l.createErrorResponse)("用户不存在",404,l.ErrorCode.USER_NOT_FOUND,"User not found");if(!await (0,n.compare)(t,u.password))return y.warn({username:e},"Invalid password"),(0,l.createErrorResponse)("密码错误",401,l.ErrorCode.UNAUTHORIZED,"Invalid password");d=u.email,c=h.subjectId,y.info({userId:u.id,email:u.email},"User authenticated via credentials")}let{images:g}=h;if(!g||!Array.isArray(g)||0===g.length)return(0,l.createErrorResponse)("未提供图片数据",400,l.ErrorCode.BAD_REQUEST,"Missing images array");if(g.length>20)return(0,l.createErrorResponse)("图片数量超过限制: 最多20张",400,l.ErrorCode.BAD_REQUEST,"Maximum 20 images allowed");let m=u;if(m||(m=await i.prisma.user.findUnique({where:{email:d}})),!m)return y.warn({userEmail:d},"User not found"),(0,l.createErrorResponse)("用户不存在",404,l.ErrorCode.USER_NOT_FOUND,"User not found");let f=parseInt(process.env.OPENCLAW_TIMEOUT||"30000",10),w=Math.min(3e3,f/g.length),R=[],A=(0,o.startBackgroundTask)({userId:m.id,kind:"batch_upload",total:g.length});p=A;let I=()=>A.setProgress(R.length,g.length,R.filter(e=>!e.success).length);for(let e=0;e<g.length;e++){I();let{base64:t,mimeType:r,filename:a}=g[e],n=function(e,t){if(!e||0===e.length)return{valid:!1,error:"图片数据为空"};let r=t.toLowerCase().substring(t.lastIndexOf("."));if(!T.includes(r))return{valid:!1,error:`不支持的图片格式: ${r},仅支持 JPG、PNG`};let a=3*e.length/4;return a>5242880?{valid:!1,error:`图片大小超过限制: ${Math.round(a/1024/1024)}MB > 5MB`}:{valid:!0}}(t,a);if(!n.valid){y.warn({index:e,filename:a,error:n.error},"Image validation failed"),R.push({success:!1,index:e,error:n.error});continue}let i=await E(t,r,w);if(!i.success||!i.data){y.error({index:e,error:i.error},"Openclaw recognition failed"),R.push({success:!1,index:e,error:i.error||"识别失败"});continue}try{let a=await v(m.id,t,r,i.data,c);R.push({success:!0,index:e,errorItemId:a.id,..."duplicate"in a?{duplicate:a.duplicate,mistakeRecorded:a.mistakeRecorded,similarity:a.similarity,practiceRecordId:a.practiceRecordId,message:a.message}:{}}),y.info({index:e,errorItemId:a.id},"Error item created successfully")}catch(t){y.error({index:e,error:t?.message||String(t)},"Failed to create error item"),R.push({success:!1,index:e,error:`数据库写入失败: ${t?.message||String(t)}`})}}let C=R.filter(e=>e.success).length,O=R.length-C;I(),0===C?A.fail("ALL_FAILED"):A.succeed(),y.info({total:R.length,success:C,failed:O},"Batch upload completed");let x=0===O?201:207;return a.NextResponse.json({success:0===O,total:R.length,successCount:C,failCount:O,results:R},{status:x})}catch(e){return p?.fail(e),y.error({error:e?.message||String(e),stack:e?.stack},"Batch upload error"),(0,l.createErrorResponse)(e?.message||"批量上传失败",500,l.ErrorCode.INTERNAL_ERROR,e?.message||String(e))}}e.s(["POST",0,A]),r()}catch(e){r(e)}},!1),105140,e=>{"use strict";var t=e.i(747909),r=e.i(174017),a=e.i(996250),n=e.i(759756),i=e.i(561916),s=e.i(174677),o=e.i(869741),l=e.i(316795),u=e.i(487718),d=e.i(995169),c=e.i(47587),p=e.i(666012),h=e.i(570101),g=e.i(626937),m=e.i(10372),f=e.i(193695),w=e.i(509580);e.i(52474);var R=e.i(600220);let E=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/openclaw/batch-upload/route",pathname:"/api/openclaw/batch-upload",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/openclaw/batch-upload/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(710821),...{}}),{workAsyncStorage:v,workUnitAsyncStorage:A,serverHooks:y}=E;async function T(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),E.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/openclaw/batch-upload/route";v=v.replace(/\/index$/,"")||"/";let A=await E.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!A)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:T,params:I,nextConfig:C,parsedUrl:O,isDraftMode:x,prerenderManifest:S,routerServerContext:P,isOnDemandRevalidate:b,revalidateOnlyGenerated:N,resolvedPathname:U,clientReferenceManifest:_,serverActionsManifest:k}=A,D=(0,o.normalizeAppPath)(v),M=!!S.routes[U]&&(E.isDev||(0,w.isRouteCacheOwner)(U,E.cacheOwner,S.routes[U])),q=!!(S.dynamicRoutes[D]||M),H=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,O,!1):t.end("This page could not be found"),null);if(q&&!x){let e=S.dynamicRoutes[D];if(e&&!1===e.fallback&&!M){if(C.adapterPath)return await H();throw new f.NoFallbackError}}let L=null;!q||E.isDev||x||(L="/index"===(L=U)?"/":L);let j=!0===E.isDev||!q,$=q&&!j;k&&_&&(0,s.setManifestsSingleton)({page:v,clientReferenceManifest:_,serverActionsManifest:k});let F=e.method||"GET",B=(0,i.getTracer)(),G=B.getActiveScopeSpan(),K=!!(null==P?void 0:P.isWrappedByNextServer),W=!!(0,n.getRequestMeta)(e,"minimalMode"),Z=(0,n.getRequestMeta)(e,"incrementalCache")||await E.getIncrementalCache(e,C,S,W);null==Z||Z.resetRequestCache(),globalThis.__incrementalCache=Z;let Q={params:I,previewProps:S.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts,useCacheTimeout:C.experimental.useCacheTimeout},cacheComponents:!!C.cacheComponents,validationLevel:C.experimental.instantInsights.validationLevel,isDraftMode:x,supportsDynamicResponse:j,incrementalCache:Z,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:C.cacheLife,staticPageGenerationTimeout:C.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>E.onRequestError(e,t,a,n,P)},sharedContext:{buildId:y,deploymentId:T}},Y=new l.NodeNextRequest(e),z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(Y,(0,u.signalFromNodeResponse)(t)),V=async({previousCacheEntry:r})=>{try{if(!W&&b&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await E.handle(J,Q);e.fetchMetrics=Q.renderOpts.fetchMetrics;let i=Q.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let s=Q.renderOpts.collectedTags;if(!q)return await (0,p.sendResponse)(Y,z,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[m.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==Q.renderOpts.collectedRevalidate&&!(Q.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&Q.renderOpts.collectedRevalidate,a=void 0===Q.renderOpts.collectedExpire||Q.renderOpts.collectedExpire>=m.INFINITE_CACHE?!1!==r&&r>0?C.expireTime:void 0:Q.renderOpts.collectedExpire;return{value:{kind:R.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await E.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,P),t}},X=async(n,s)=>{try{var o,l;let n=await E.handleResponse({req:e,nextConfig:C,cacheKey:L,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:S,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:N,responseGenerator:V,waitUntil:a.waitUntil,isMinimalMode:W});if(!q)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==R.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});W||t.setHeader("x-nextjs-cache",b?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),x&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);W&&q||i.delete(m.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,g.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(Y,z,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof f.NoFallbackError||await E.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,P),q)throw t;await (0,p.sendResponse)(Y,z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=B.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||D,o=`${F} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),s&&s!==n&&(s.setAttribute("http.route",a),s.updateName(o))})()}};if(K&&G)await X(G,void 0);else{let t=B.getActiveScopeSpan();await B.withPropagatedContext(e.headers,()=>B.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${v}`,kind:i.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>X(e,t)),void 0,!K)}}e.s(["handler",0,T,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:v,workUnitAsyncStorage:A})},"routeModule",0,E,"serverHooks",0,y,"workAsyncStorage",0,v,"workUnitAsyncStorage",0,A])}];
1
+ module.exports=[10821,e=>e.a(async(t,r)=>{try{var a=e.i(58821),n=e.i(44950),i=e.i(98043),s=e.i(50377),o=e.i(26828),l=e.i(76759),u=e.i(39811),d=e.i(83508),c=e.i(4083),p=e.i(92366),h=e.i(95886),g=e.i(60979),m=e.i(99617),f=e.i(55920),w=e.i(98003),R=t([n]);[n]=R.then?(await R)():R;let y=(0,s.createLogger)("api:openclaw:batch-upload"),T=[".jpg",".jpeg",".png"];async function E(e,t,r){let a=process.env.OPENCLAW_API_URL||"http://localhost:8080",n=process.env.OPENCLAW_API_KEY||"",i=new AbortController,s=setTimeout(()=>i.abort(),r);try{let r=await fetch(`${a}/api/recognize`,{method:"POST",headers:{"Content-Type":"application/json",...n?{Authorization:`Bearer ${n}`}:{}},body:JSON.stringify({image:e,mimeType:t}),signal:i.signal});if(clearTimeout(s),!r.ok){let e=await r.text();return y.error({status:r.status,error:e},"Openclaw agent error"),{success:!1,error:`识别服务异常: HTTP ${r.status}`}}return await r.json()}catch(e){if(clearTimeout(s),"AbortError"===e.name)return y.error("Openclaw agent timeout"),{success:!1,error:"识别服务超时"};return y.error({error:e?.message||String(e)},"Openclaw agent request failed"),{success:!1,error:`识别服务请求失败: ${e?.message||String(e)}`}}}async function v(e,t,r,a,n){let{questionText:i,answerText:s,analysis:o,knowledgePoints:l,errorType:R,source:E}=a||{},v=(0,m.parseDifficultyStars)(a?.difficultyStars),A={questionText:i,answerText:s,analysis:o,wrongAnswerText:a?.wrongAnswerText,mistakeAnalysis:a?.mistakeAnalysis,originalImageUrl:`data:${r};base64,${t}`},T=await (0,g.runQuestionImportTransaction)(async a=>{let h=await (0,g.findDuplicateQuestion)(a,e,A);if(h)return(0,g.recordDuplicateQuestion)(a,e,h,A);let m=Array.isArray(l)?l:[],T=[],I=n?await a.subject.findUnique({where:{id:n}}):null,C=I?(0,d.inferSubjectFromName)(I.name):null,O=await a.user.findUnique({where:{id:e},select:{educationStage:!0,enrollmentYear:!0}}),x=null;for(let t of(O?.educationStage&&O?.enrollmentYear&&(x=(0,u.calculateGrade)(O.educationStage,O.enrollmentYear,new Date,"en",(0,w.getAppTimeZone)())),m))try{let r=await a.knowledgeTag.findFirst({where:{name:t,OR:[{isSystem:!0},{userId:e}]}});if(!r){let n=x&&C?await (0,c.findParentTagIdForGrade)(x,C,a):null;r=await a.knowledgeTag.create({data:{name:t,subject:C||"other",isSystem:!1,userId:e,parentId:n||void 0}})}T.push({id:r.id})}catch(e){y.error({tagName:t,error:e},"Error processing tag")}return await a.errorItem.create({data:{shortId:await (0,p.generateUniqueShortId)(a),userId:e,subjectId:n||void 0,originalImageUrl:`data:${r};base64,${t}`,ocrText:i||null,questionText:i||null,answerText:s||null,analysis:o||null,knowledgePoints:JSON.stringify(m),gradeSemester:x,paperLevel:(0,f.getDefaultPaperLevel)(v),difficultyStars:v,errorType:R||null,source:E||"Openclaw",masteryLevel:0,tags:{connect:T}},include:{tags:!0,subject:!0}})});return"duplicate"in T&&T.duplicate&&(0,h.scheduleMasteryEvaluation)([T.id]),T}async function A(e){y.info("POST /api/openclaw/batch-upload called");let t=e.headers.get("x-api-key"),r=process.env.OPENCLAW_INTEGRATION_API_KEY,s=process.env.OPENCLAW_AUTH_MODE||"credentials",u=null,d=null,c=null,p=null;try{let h=await e.json();if("apikey"===s&&r){if(!t)return y.warn("Missing API key in request"),(0,l.createErrorResponse)("未提供API密钥",401,l.ErrorCode.UNAUTHORIZED,"Missing API key");if(t!==r)return y.warn("Invalid API key provided"),(0,l.createErrorResponse)("API密钥无效",401,l.ErrorCode.UNAUTHORIZED,"Invalid API key");d=h.userEmail,c=h.subjectId}else{let{username:e,password:t}=h;if(!e||!t)return(0,l.createErrorResponse)("请提供用户名和密码",401,l.ErrorCode.UNAUTHORIZED,"Missing username or password");if(!(u=await i.prisma.user.findFirst({where:{OR:[{email:e},{name:e}]}})))return y.warn({username:e},"User not found"),(0,l.createErrorResponse)("用户不存在",404,l.ErrorCode.USER_NOT_FOUND,"User not found");if(!await (0,n.compare)(t,u.password))return y.warn({username:e},"Invalid password"),(0,l.createErrorResponse)("密码错误",401,l.ErrorCode.UNAUTHORIZED,"Invalid password");d=u.email,c=h.subjectId,y.info({userId:u.id,email:u.email},"User authenticated via credentials")}let{images:g}=h;if(!g||!Array.isArray(g)||0===g.length)return(0,l.createErrorResponse)("未提供图片数据",400,l.ErrorCode.BAD_REQUEST,"Missing images array");if(g.length>20)return(0,l.createErrorResponse)("图片数量超过限制: 最多20张",400,l.ErrorCode.BAD_REQUEST,"Maximum 20 images allowed");let m=u;if(m||(m=await i.prisma.user.findUnique({where:{email:d}})),!m)return y.warn({userEmail:d},"User not found"),(0,l.createErrorResponse)("用户不存在",404,l.ErrorCode.USER_NOT_FOUND,"User not found");let f=parseInt(process.env.OPENCLAW_TIMEOUT||"30000",10),w=Math.min(3e3,f/g.length),R=[],A=(0,o.startBackgroundTask)({userId:m.id,kind:"batch_upload",total:g.length});p=A;let I=()=>A.setProgress(R.length,g.length,R.filter(e=>!e.success).length);for(let e=0;e<g.length;e++){I();let{base64:t,mimeType:r,filename:a}=g[e],n=function(e,t){if(!e||0===e.length)return{valid:!1,error:"图片数据为空"};let r=t.toLowerCase().substring(t.lastIndexOf("."));if(!T.includes(r))return{valid:!1,error:`不支持的图片格式: ${r},仅支持 JPG、PNG`};let a=3*e.length/4;return a>5242880?{valid:!1,error:`图片大小超过限制: ${Math.round(a/1024/1024)}MB > 5MB`}:{valid:!0}}(t,a);if(!n.valid){y.warn({index:e,filename:a,error:n.error},"Image validation failed"),R.push({success:!1,index:e,error:n.error});continue}let i=await E(t,r,w);if(!i.success||!i.data){y.error({index:e,error:i.error},"Openclaw recognition failed"),R.push({success:!1,index:e,error:i.error||"识别失败"});continue}try{let a=await v(m.id,t,r,i.data,c);R.push({success:!0,index:e,errorItemId:a.id,..."duplicate"in a?{duplicate:a.duplicate,mistakeRecorded:a.mistakeRecorded,similarity:a.similarity,practiceRecordId:a.practiceRecordId,message:a.message}:{}}),y.info({index:e,errorItemId:a.id},"Error item created successfully")}catch(t){y.error({index:e,error:t?.message||String(t)},"Failed to create error item"),R.push({success:!1,index:e,error:`数据库写入失败: ${t?.message||String(t)}`})}}let C=R.filter(e=>e.success).length,O=R.length-C;I(),0===C?A.fail("ALL_FAILED"):A.succeed(),y.info({total:R.length,success:C,failed:O},"Batch upload completed");let x=0===O?201:207;return a.NextResponse.json({success:0===O,total:R.length,successCount:C,failCount:O,results:R},{status:x})}catch(e){return p?.fail(e),y.error({error:e?.message||String(e),stack:e?.stack},"Batch upload error"),(0,l.createErrorResponse)(e?.message||"批量上传失败",500,l.ErrorCode.INTERNAL_ERROR,e?.message||String(e))}}e.s(["POST",0,A]),r()}catch(e){r(e)}},!1),5140,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),n=e.i(59756),i=e.i(61916),s=e.i(74677),o=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),c=e.i(47587),p=e.i(66012),h=e.i(70101),g=e.i(74838),m=e.i(10372),f=e.i(93695),w=e.i(9580);e.i(52474);var R=e.i(220);let E=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/openclaw/batch-upload/route",pathname:"/api/openclaw/batch-upload",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/openclaw/batch-upload/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(10821),...{}}),{workAsyncStorage:v,workUnitAsyncStorage:A,serverHooks:y}=E;async function T(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),E.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/openclaw/batch-upload/route";v=v.replace(/\/index$/,"")||"/";let A=await E.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!A)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,deploymentId:T,params:I,nextConfig:C,parsedUrl:O,isDraftMode:x,prerenderManifest:S,routerServerContext:P,isOnDemandRevalidate:b,revalidateOnlyGenerated:N,resolvedPathname:U,clientReferenceManifest:_,serverActionsManifest:k}=A,D=(0,o.normalizeAppPath)(v),M=!!S.routes[U]&&(E.isDev||(0,w.isRouteCacheOwner)(U,E.cacheOwner,S.routes[U])),q=!!(S.dynamicRoutes[D]||M),H=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,O,!1):t.end("This page could not be found"),null);if(q&&!x){let e=S.dynamicRoutes[D];if(e&&!1===e.fallback&&!M){if(C.adapterPath)return await H();throw new f.NoFallbackError}}let L=null;!q||E.isDev||x||(L="/index"===(L=U)?"/":L);let j=!0===E.isDev||!q,$=q&&!j;k&&_&&(0,s.setManifestsSingleton)({page:v,clientReferenceManifest:_,serverActionsManifest:k});let F=e.method||"GET",B=(0,i.getTracer)(),G=B.getActiveScopeSpan(),K=!!(null==P?void 0:P.isWrappedByNextServer),W=!!(0,n.getRequestMeta)(e,"minimalMode"),Z=(0,n.getRequestMeta)(e,"incrementalCache")||await E.getIncrementalCache(e,C,S,W);null==Z||Z.resetRequestCache(),globalThis.__incrementalCache=Z;let Q={params:I,previewProps:S.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts,useCacheTimeout:C.experimental.useCacheTimeout},cacheComponents:!!C.cacheComponents,validationLevel:C.experimental.instantInsights.validationLevel,isDraftMode:x,supportsDynamicResponse:j,incrementalCache:Z,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:C.cacheLife,staticPageGenerationTimeout:C.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>E.onRequestError(e,t,a,n,P)},sharedContext:{buildId:y,deploymentId:T}},Y=new l.NodeNextRequest(e),z=new l.NodeNextResponse(t),J=u.NextRequestAdapter.fromNodeNextRequest(Y,(0,u.signalFromNodeResponse)(t)),V=async({previousCacheEntry:r})=>{try{if(!W&&b&&N&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await E.handle(J,Q);e.fetchMetrics=Q.renderOpts.fetchMetrics;let i=Q.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let s=Q.renderOpts.collectedTags;if(!q)return await (0,p.sendResponse)(Y,z,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);s&&(t[m.NEXT_CACHE_TAGS_HEADER]=s),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==Q.renderOpts.collectedRevalidate&&!(Q.renderOpts.collectedRevalidate>=m.INFINITE_CACHE)&&Q.renderOpts.collectedRevalidate,a=void 0===Q.renderOpts.collectedExpire||Q.renderOpts.collectedExpire>=m.INFINITE_CACHE?!1!==r&&r>0?C.expireTime:void 0:Q.renderOpts.collectedExpire;return{value:{kind:R.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await E.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,P),t}},X=async(n,s)=>{try{var o,l;let n=await E.handleResponse({req:e,nextConfig:C,cacheKey:L,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:S,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:N,responseGenerator:V,waitUntil:a.waitUntil,isMinimalMode:W});if(!q)return;if((null==n||null==(o=n.value)?void 0:o.kind)!==R.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});W||t.setHeader("x-nextjs-cache",b?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),x&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);W&&q||i.delete(m.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,g.getCacheControlHeader)(n.cacheControl)),await (0,p.sendResponse)(Y,z,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof f.NoFallbackError||await E.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,P),q)throw t;await (0,p.sendResponse)(Y,z,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let r=B.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||D,o=`${F} ${a}`;n.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),n.updateName(o),s&&s!==n&&(s.setAttribute("http.route",a),s.updateName(o))})()}};if(K&&G)await X(G,void 0);else{let t=B.getActiveScopeSpan();await B.withPropagatedContext(e.headers,()=>B.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${v}`,kind:i.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>X(e,t)),void 0,!K)}}e.s(["handler",0,T,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:v,workUnitAsyncStorage:A})},"routeModule",0,E,"serverHooks",0,y,"workAsyncStorage",0,v,"workUnitAsyncStorage",0,A])}];
2
2
 
3
3
  //# sourceMappingURL=_1m-yyz-._.js.map
@@ -0,0 +1,3 @@
1
+ module.exports=[15965,e=>e.a(async(t,r)=>{try{var a=e.i(58821),i=e.i(69719),s=e.i(63856),n=e.i(76759),o=e.i(50377),u=e.i(74866),l=e.i(95886),d=t([s]);[s]=d.then?(await d)():d;let m=(0,o.createLogger)("api:exams:results"),p=i.z.object({takenAt:i.z.string().datetime({offset:!0}).optional(),results:i.z.array(i.z.object({questionId:i.z.string().min(1),result:i.z.enum(l.PRACTICE_RESULTS).nullable()})).min(1).max(100)});async function c(e,{params:t}){let{id:r}=await t;try{let t=await (0,s.getCurrentUser)();if(!t)return(0,n.unauthorized)("Authentication required");let i=p.safeParse(await e.json());if(!i.success)return(0,n.validationError)("Invalid exam results",i.error.issues);let o=i.data.takenAt?new Date(i.data.takenAt):new Date,d=await (0,u.recordExamResults)(r,t.id,o,i.data.results);return(0,l.scheduleMasteryEvaluation)(d),a.NextResponse.json({success:!0,affectedCount:d.length})}catch(e){if(e instanceof Error&&"EXAM_NOT_FOUND"===e.message)return(0,n.notFound)("Exam paper not found");return m.error({error:e},"Error recording exam results"),(0,n.internalError)("Failed to record exam results")}}e.s(["POST",0,c]),r()}catch(e){r(e)}},!1),59744,e=>{"use strict";var t=e.i(47909),r=e.i(74017),a=e.i(96250),i=e.i(59756),s=e.i(61916),n=e.i(74677),o=e.i(69741),u=e.i(16795),l=e.i(87718),d=e.i(95169),c=e.i(47587),m=e.i(66012),p=e.i(70101),f=e.i(74838),h=e.i(10372),g=e.i(93695),w=e.i(9580);e.i(52474);var y=e.i(220);let E=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/exams/[id]/results/route",pathname:"/api/exams/[id]/results",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/exams/[id]/results/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(15965),...{}}),{workAsyncStorage:R,workUnitAsyncStorage:x,serverHooks:S}=E;async function v(e,t,a){a.requestMeta&&(0,i.setRequestMeta)(e,a.requestMeta),E.isDev&&(0,i.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let R="/api/exams/[id]/results/route";R=R.replace(/\/index$/,"")||"/";let x=await E.prepare(e,t,{srcPage:R,multiZoneDraftMode:!1});if(!x)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:S,deploymentId:v,params:T,nextConfig:I,parsedUrl:A,isDraftMode:_,prerenderManifest:C,routerServerContext:P,isOnDemandRevalidate:b,revalidateOnlyGenerated:q,resolvedPathname:O,clientReferenceManifest:M,serverActionsManifest:N}=x,U=(0,o.normalizeAppPath)(R),k=!!C.routes[O]&&(E.isDev||(0,w.isRouteCacheOwner)(O,E.cacheOwner,C.routes[O])),D=!!(C.dynamicRoutes[U]||k),L=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,A,!1):t.end("This page could not be found"),null);if(D&&!_){let e=C.dynamicRoutes[U];if(e&&!1===e.fallback&&!k){if(I.adapterPath)return await L();throw new g.NoFallbackError}}let H=null;!D||E.isDev||_||(H="/index"===(H=O)?"/":H);let j=!0===E.isDev||!D,Q=D&&!j;N&&M&&(0,n.setManifestsSingleton)({page:R,clientReferenceManifest:M,serverActionsManifest:N});let F=e.method||"GET",X=(0,s.getTracer)(),$=X.getActiveScopeSpan(),z=!!(null==P?void 0:P.isWrappedByNextServer),B=!!(0,i.getRequestMeta)(e,"minimalMode"),K=(0,i.getRequestMeta)(e,"incrementalCache")||await E.getIncrementalCache(e,I,C,B);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let G={params:T,previewProps:C.preview,renderOpts:{experimental:{authInterrupts:!!I.experimental.authInterrupts,useCacheTimeout:I.experimental.useCacheTimeout},cacheComponents:!!I.cacheComponents,validationLevel:I.experimental.instantInsights.validationLevel,isDraftMode:_,supportsDynamicResponse:j,incrementalCache:K,hmrRefreshHash:(0,i.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:I.cacheLife,staticPageGenerationTimeout:I.staticPageGenerationTimeout,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,i)=>E.onRequestError(e,t,a,i,P)},sharedContext:{buildId:S,deploymentId:v}},W=new u.NodeNextRequest(e),Y=new u.NodeNextResponse(t),V=l.NextRequestAdapter.fromNodeNextRequest(W,(0,l.signalFromNodeResponse)(t)),J=async({previousCacheEntry:r})=>{try{if(!B&&b&&q&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let i=await E.handle(V,G);e.fetchMetrics=G.renderOpts.fetchMetrics;let s=G.renderOpts.pendingWaitUntil;s&&a.waitUntil&&(a.waitUntil(s),s=void 0);let n=G.renderOpts.collectedTags;if(!D)return await (0,m.sendResponse)(W,Y,i,s),null;{let e=await i.blob(),t=(0,p.toNodeOutgoingHttpHeaders)(i.headers);n&&(t[h.NEXT_CACHE_TAGS_HEADER]=n),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=h.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,a=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=h.INFINITE_CACHE?!1!==r&&r>0?I.expireTime:void 0:G.renderOpts.collectedExpire;return{value:{kind:y.CachedRouteKind.APP_ROUTE,status:i.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await E.onRequestError(e,t,{routerKind:"App Router",routePath:R,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:Q,isOnDemandRevalidate:b})},!1,P),t}},Z=async(i,n)=>{try{var o,u;let i=await E.handleResponse({req:e,nextConfig:I,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:C,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:q,responseGenerator:J,waitUntil:a.waitUntil,isMinimalMode:B});if(!D)return;if((null==i||null==(o=i.value)?void 0:o.kind)!==y.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==i||null==(u=i.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",b?"REVALIDATED":i.isMiss?"MISS":i.isStale?"STALE":"HIT"),_&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let s=(0,p.fromNodeOutgoingHttpHeaders)(i.value.headers);B&&D||s.delete(h.NEXT_CACHE_TAGS_HEADER),!i.cacheControl||t.getHeader("Cache-Control")||s.get("Cache-Control")||s.set("Cache-Control",(0,f.getCacheControlHeader)(i.cacheControl)),await (0,m.sendResponse)(W,Y,new Response(i.value.body,{headers:s,status:i.value.status||200}));return}catch(t){if(t instanceof g.NoFallbackError||await E.onRequestError(e,t,{routerKind:"App Router",routePath:U,routeType:"route",revalidateReason:(0,c.getRevalidateReason)({isStaticGeneration:Q,isOnDemandRevalidate:b})},!1,P),D)throw t;await (0,m.sendResponse)(W,Y,new Response(null,{status:500}));return}finally{(()=>{if(!i)return;let e=t.statusCode;i.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(i.setStatus({code:s.SpanStatusCode.ERROR}),i.setAttribute("error.type",e.toString()));let r=X.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route")||U,o=`${F} ${a}`;i.setAttributes({"next.route":a,"http.route":a,"next.span_name":o}),i.updateName(o),n&&n!==i&&(n.setAttribute("http.route",a),n.updateName(o))})()}};if(z&&$)await Z($,void 0);else{let t=X.getActiveScopeSpan();await X.withPropagatedContext(e.headers,()=>X.trace(d.BaseServerSpan.handleRequest,{spanName:`${F} ${R}`,kind:s.SpanKind.SERVER,attributes:{"http.method":F,"http.target":e.url}},e=>Z(e,t)),void 0,!z)}}e.s(["handler",0,v,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:R,workUnitAsyncStorage:x})},"routeModule",0,E,"serverHooks",0,S,"workAsyncStorage",0,R,"workUnitAsyncStorage",0,x])},63856,e=>e.a(async(t,r)=>{try{var a=e.i(13618),i=e.i(79832),s=e.i(98043),n=t([i]);async function o(){let e=await (0,a.getServerSession)(i.authOptions);return e?.user?.email?s.prisma.user.findUnique({where:{email:e.user.email}}):null}[i]=n.then?(await n)():n,e.s(["getCurrentUser",0,o]),r()}catch(e){r(e)}},!1),74866,e=>{"use strict";var t=e.i(98043),r=e.i(43911),a=e.i(50377),i=e.i(95408),s=e.i(26828),n=e.i(68426);let o=(0,a.createLogger)("exam"),u="least_practiced";function l(e,t,r=Math.random){let a=[...e];for(let e=a.length-1;e>0;e--){let t=Math.floor(r()*(e+1));[a[e],a[t]]=[a[t],a[e]]}return a.slice(0,t)}async function d(e,r){let a,s=(await t.prisma.errorItem.findMany({where:(a={userId:e,subjectId:{in:r.subjectIds},shortId:{not:null}},"unmastered"===r.scope?a.NOT=(0,i.masteryStatusWhere)("mastered"):"mastered"===r.scope&&(a.AND=[(0,i.masteryStatusWhere)("mastered")]),r.tagNames&&r.tagNames.length>0&&(a.tags={some:{name:{in:r.tagNames}}}),a),select:{id:!0,shortId:!0,_count:{select:{practiceRecords:!0}}}})).map(({_count:e,...t})=>({...t,practiceCount:e.practiceRecords}));return(r.pickRule??u)==="random"?l(s,r.count):function(e,t,r=Math.random){return l(e,e.length,r).sort((e,t)=>e.practiceCount-t.practiceCount).slice(0,t)}(s,r.count)}function c(e){if(e.some(e=>"pending"===e))return"generating";let t=e.filter(e=>"ready"===e).length;return t===e.length?"ready":0===t?"failed":"partial"}function m(e){if(e.tags.length>0)return e.tags.map(e=>e.name);try{let t=JSON.parse(e.knowledgePoints||"[]");return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}async function p(e,a,i){let s=await t.prisma.examQuestion.findUnique({where:{id:e},select:{errorItem:{select:{questionText:!0,knowledgePoints:!0,gradeSemester:!0,figureSvg:!0,tags:{select:{name:!0}}}}}});if(!s?.errorItem)return void await t.prisma.examQuestion.update({where:{id:e},data:{status:"failed",error:"SOURCE_DELETED"}});try{let n=await (0,r.getAIService)().generateSimilarQuestion(s.errorItem.questionText||"",m(s.errorItem),i,a,s.errorItem.gradeSemester,s.errorItem.figureSvg);await t.prisma.examQuestion.update({where:{id:e},data:{status:"ready",questionText:n.questionText,answerText:n.answerText,analysis:n.analysis,figureSvg:n.figureSvg??null,error:null}})}catch(a){let r=a instanceof Error?a.message:String(a);o.warn({questionId:e,error:r},"Exam question generation failed"),await t.prisma.examQuestion.update({where:{id:e},data:{status:"failed",error:r.slice(0,200)}})}}let f=new Set;async function h(e,r="zh"){if(f.has(e))return;f.add(e);let a=null;try{let i=await t.prisma.examPaper.findUnique({where:{id:e},select:{userId:!0,title:!0,difficulty:!0,questions:{where:{status:{not:"ready"}},select:{id:!0}}}});if(!i)return;let n=i.questions.map(e=>e.id),o=n.length,u=0;o>0&&(a=(0,s.startBackgroundTask)({userId:i.userId,kind:"exam",subject:i.title,link:`/exams/${e}`,total:o})),n.length>0&&(await t.prisma.examQuestion.updateMany({where:{id:{in:n}},data:{status:"pending",error:null}}),await t.prisma.examPaper.update({where:{id:e},data:{status:"generating"}}));let l=async()=>{for(;n.length>0;)await p(n.shift(),i.difficulty,r),a?.setProgress(++u,o)};await Promise.all(Array.from({length:Math.min(3,n.length)},l));let d=await t.prisma.examQuestion.findMany({where:{paperId:e},select:{status:!0}}),m=c(d.map(e=>e.status));await t.prisma.examPaper.update({where:{id:e},data:{status:m}}),a?.setProgress(u,o,d.filter(e=>"failed"===e.status).length),"failed"===m?a?.fail("ALL_FAILED"):a?.succeed()}catch(t){o.error({paperId:e,error:t},"Exam paper generation failed"),a?.fail(t)}finally{f.delete(e)}}let g={status:!0,questionText:!0,answerText:!0,analysis:!0,figureSvg:!0,error:!0};async function w(e,a,i,u,l="zh"){let d=await t.prisma.examQuestion.findUnique({where:{id:a},select:{paperId:!0,status:!0,questionText:!0,paper:{select:{userId:!0,title:!0,difficulty:!0}},errorItem:{select:{questionText:!0,knowledgePoints:!0,gradeSemester:!0,figureSvg:!0,tags:{select:{name:!0}},subject:{select:{name:!0,stage:!0,subjectKey:!0}}}},_count:{select:{practiceRecords:!0}}}});if(!d||d.paperId!==e||d.paper.userId!==i)throw Error("EXAM_QUESTION_NOT_FOUND");if("pending"===d.status)throw Error("QUESTION_GENERATING");let c={userId:i,subject:d.paper.title,link:`/exams/${e}`};if("question"===u){if(d._count.practiceRecords>0)throw Error("HAS_RESULTS");let i=d.errorItem;if(!i)throw Error("SOURCE_DELETED");let n=await (0,s.trackBackgroundTask)({...c,kind:"exam"},()=>(0,r.getAIService)().generateSimilarQuestion(i.questionText||"",m(i),l,d.paper.difficulty,i.gradeSemester,i.figureSvg)),{count:o}=await t.prisma.examQuestion.updateMany({where:{id:a,practiceRecords:{none:{}}},data:{status:"ready",questionText:n.questionText,answerText:n.answerText,analysis:n.analysis,figureSvg:n.figureSvg??null,error:null}});if(0===o)throw Error("HAS_RESULTS");await y(e)}else{let e=d.questionText;if("ready"!==d.status||!e?.trim())throw Error("NO_QUESTION_TEXT");let i=d.errorItem?.subject?(0,n.resolveNotebookScope)(d.errorItem.subject):null,o=i?.subject?n.SUBJECT_DISPLAY_NAMES[i.subject]:null,u=await (0,s.trackBackgroundTask)({...c,kind:"reanswer"},()=>(0,r.getAIService)().reanswerQuestion(e,l,o,void 0,d.errorItem?.gradeSemester));if(!u.answerText.trim()&&!u.analysis.trim())throw Error("EMPTY_ANSWER");let m={answerText:u.answerText,analysis:u.analysis};await t.prisma.$transaction([t.prisma.examQuestion.update({where:{id:a},data:m}),t.prisma.practiceRecord.updateMany({where:{examQuestionId:a},data:m})])}let p=await t.prisma.examQuestion.findUnique({where:{id:a},select:g});return o.info({paperId:e,questionId:a,mode:u},"Exam question regenerated"),p}async function y(e){let r=await t.prisma.examQuestion.findMany({where:{paperId:e},select:{status:!0}});await t.prisma.examPaper.update({where:{id:e},data:{status:c(r.map(e=>e.status))}})}async function E(e,r,a,i){let s=await t.prisma.examPaper.findUnique({where:{id:e},select:{userId:!0,difficulty:!0,questions:{select:{id:!0,errorItemId:!0,questionText:!0,answerText:!0,analysis:!0,figureSvg:!0,errorItem:{select:{subject:{select:{name:!0}}}}}}}});if(!s||s.userId!==r)throw Error("EXAM_NOT_FOUND");let n=new Map(s.questions.map(e=>[e.id,e])),o=new Set;return await t.prisma.$transaction(async t=>{for(let{questionId:e,result:u}of i){let i=n.get(e);i?.errorItemId&&null!==u&&(await t.practiceRecord.create({data:{userId:r,errorItemId:i.errorItemId,examQuestionId:i.id,source:"exam",result:u,isCorrect:"correct"===u,createdAt:a,difficulty:s.difficulty,subject:i.errorItem?.subject?.name??null,questionText:i.questionText,answerText:i.answerText,analysis:i.analysis,figureSvg:i.figureSvg}}),o.add(i.errorItemId))}o.size>0&&await t.examPaper.update({where:{id:e},data:{resultsRecordedAt:new Date}})}),[...o]}e.s(["DEFAULT_EXAM_PICK_RULE",0,u,"EXAM_DIFFICULTIES",0,["easy","medium","hard","harder"],"EXAM_PICK_RULES",0,["least_practiced","random"],"EXAM_REGENERATE_MODES",0,["question","answer"],"EXAM_SCOPES",0,["unmastered","mastered","all"],"MAX_EXAM_QUESTIONS",0,50,"generateExamPaper",0,h,"isPaperGenerating",0,function(e){return f.has(e)},"recordExamResults",0,E,"regenerateExamQuestion",0,w,"selectSourceItems",0,d])},95408,e=>{"use strict";let t=["new","reviewing","mastered"],r={practiceRecords:{some:{result:{not:null}}}};e.s(["MASTERY_THRESHOLD",0,.5,"PRACTICE_RECORD_COUNT",0,{select:{practiceRecords:{where:{result:{not:null}}}}},"isMasteryStatus",0,function(e){return"string"==typeof e&&t.includes(e)},"masteryLevelOf",0,function(e){return t.indexOf(e)},"masteryStatusOf",0,function(e,t){return 0===e?"new":"number"==typeof t&&t>=.5?"mastered":"reviewing"},"masteryStatusWhere",0,function(e){return"new"===e?{practiceRecords:{none:{result:{not:null}}}}:"mastered"===e?{...r,masteryProbability:{gte:.5}}:{...r,OR:[{masteryProbability:null},{masteryProbability:{lt:.5}}]}}])},95886,e=>{"use strict";var t=e.i(98043),r=e.i(43911),a=e.i(50377),i=e.i(95408);let s=(0,a.createLogger)("mastery"),n=["correct","wrong","not_attempted"];function o(e){return"string"==typeof e&&n.includes(e)}let u={easy:.85,medium:.95,hard:1,harder:1},l={wrong:.1,not_attempted:0};async function d(e){var a;let n=await t.prisma.errorItem.findUnique({where:{id:e},select:{id:!0,questionText:!0,mistakeStatus:!0,tags:{select:{name:!0}},practiceRecords:{where:{result:{not:null}},orderBy:[{createdAt:"asc"},{id:"asc"}],select:{result:!0,difficulty:!0,source:!0,createdAt:!0}}}});if(!n)return;let d=n.practiceRecords.filter(e=>o(e.result)).map(e=>({date:e.createdAt.toISOString(),difficulty:e.difficulty,result:e.result,source:e.source})),c=function(e){if(0===e.length)return null;let t=.15,r=.5;return e.forEach((a,i)=>{let s=Math.pow(.7,e.length-1-i),n="correct"===a.result?u[a.difficulty||"medium"]??u.medium:l[a.result];t+=s*n,r+=s}),Math.round(t/r*100)/100}(d);if(null===c)return void await t.prisma.errorItem.update({where:{id:n.id},data:{masteryProbability:null,masteryReason:null,masterySource:null,masteryEvaluatedAt:null,masteryLevel:(0,i.masteryLevelOf)("new")}});let m=c,p="",f="rule";try{let e=await (0,r.getAIService)().evaluateMastery({questionText:n.questionText||"",knowledgePoints:n.tags.map(e=>e.name),mistakeStatus:n.mistakeStatus,history:d,ruleProbability:c});m=e.probability,p=e.reason,f="ai"}catch(r){s.warn({errorItemId:e,error:r instanceof Error?r.message:String(r)},"AI mastery evaluation failed, using rule estimate");let t=d.filter(e=>"correct"===e.result).length;p=`共练习 ${d.length} 次,做对 ${t} 次(规则估算)`}await t.prisma.errorItem.update({where:{id:n.id},data:{masteryProbability:m,masteryReason:p,masterySource:f,masteryEvaluatedAt:new Date,masteryLevel:(a=m,(0,i.masteryLevelOf)(a>=i.MASTERY_THRESHOLD?"mastered":"reviewing"))}}),s.info({errorItemId:e,probability:m,source:f},"Mastery evaluated")}async function c(e={}){let[r,a,s]=await Promise.all(["new","reviewing","mastered"].map(r=>t.prisma.errorItem.count({where:{AND:[e,(0,i.masteryStatusWhere)(r)]}})));return{new:r,reviewing:a,mastered:s}}let m=new Set,p=!1;async function f(){if(!p){p=!0;try{for(;m.size>0;){let[e]=m;m.delete(e);try{await d(e)}catch(t){s.error({errorItemId:e,error:t},"Mastery evaluation failed")}}}finally{p=!1}}}e.s(["PRACTICE_RESULTS",0,n,"countByMasteryStatus",0,c,"isPracticeResult",0,o,"scheduleMasteryEvaluation",0,function(e){e.forEach(e=>m.add(e)),f()}])}];
2
+
3
+ //# sourceMappingURL=_1n1xsqj._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[551513,e=>e.a(async(t,a)=>{try{var r=e.i(89171),n=e.i(757660),i=e.i(79832),o=e.i(698043),s=e.i(469719),l=e.i(644950),u=e.i(181912),d=e.i(50377),p=t([i,l]);[i,l]=p.then?(await p)():p;let m=(0,d.createLogger)("api:user"),f=s.z.object({name:s.z.string().optional(),email:s.z.string().optional(),password:s.z.string().optional(),educationStage:s.z.string().optional(),enrollmentYear:s.z.number().optional().nullable(),confirmBeforeImport:s.z.boolean().optional(),enableGeogebra:s.z.boolean().optional(),enableSvgAnimation:s.z.boolean().optional(),questionDuplicateThreshold:s.z.number().min(1).max(100).multipleOf(.01).optional()});async function c(){let e=await (0,n.getServerSession)(i.authOptions);if(!e?.user?.email)return(0,u.unauthorized)();try{let t=await o.prisma.user.findUnique({where:{email:e.user.email},select:{name:!0,email:!0,educationStage:!0,enrollmentYear:!0,confirmBeforeImport:!0,enableGeogebra:!0,enableSvgAnimation:!0,questionDuplicateThreshold:!0}});if(!t)return(0,u.notFound)("User not found");return m.debug({user:t},"Returning user profile"),r.NextResponse.json(t)}catch(e){return m.error({error:e},"Failed to fetch user profile"),(0,u.internalError)("Failed to fetch user profile")}}async function h(e){let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.email)return(0,u.unauthorized)();try{let a=await e.json(),{name:n,email:i,password:s,educationStage:d,enrollmentYear:p,confirmBeforeImport:c,enableGeogebra:h,enableSvgAnimation:m,questionDuplicateThreshold:R}=f.parse(a),g={};if(n&&n.trim()&&(g.name=n.trim()),d&&d.trim()&&(g.educationStage=d.trim()),"number"!=typeof p||isNaN(p)||(g.enrollmentYear=p),"boolean"==typeof c&&(g.confirmBeforeImport=c),"boolean"==typeof h&&(g.enableGeogebra=h),"boolean"==typeof m&&(g.enableSvgAnimation=m),"number"==typeof R&&(g.questionDuplicateThreshold=R),i&&i.trim()){if(!/^[^\s@]+@[^\s@]+$/.test(i.trim()))return(0,u.badRequest)("Invalid email format");g.email=i.trim()}if(s&&s.length>0){if(s.length<6)return(0,u.badRequest)("Password must be at least 6 characters");g.password=await (0,l.hash)(s,10)}let v=await o.prisma.user.update({where:{email:t.user.email},data:g,select:{name:!0,email:!0,educationStage:!0,enrollmentYear:!0,confirmBeforeImport:!0,enableGeogebra:!0,enableSvgAnimation:!0,questionDuplicateThreshold:!0}});return r.NextResponse.json(v)}catch(e){if(m.error({error:e},"Failed to update user profile"),e instanceof s.z.ZodError)return(0,u.validationError)("Invalid input",e.issues);return(0,u.internalError)("Failed to update user profile")}}e.s(["GET",0,c,"PATCH",0,h]),a()}catch(e){a(e)}},!1),204123,e=>{"use strict";var t=e.i(747909),a=e.i(174017),r=e.i(996250),n=e.i(759756),i=e.i(561916),o=e.i(174677),s=e.i(869741),l=e.i(316795),u=e.i(487718),d=e.i(995169),p=e.i(47587),c=e.i(666012),h=e.i(570101),m=e.i(626937),f=e.i(10372),R=e.i(193695),g=e.i(509580);e.i(52474);var v=e.i(600220);let w=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/user/route",pathname:"/api/user",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/user/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(551513),...{}}),{workAsyncStorage:b,workUnitAsyncStorage:E,serverHooks:C}=w;async function y(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),w.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let b="/api/user/route";b=b.replace(/\/index$/,"")||"/";let E=await w.prepare(e,t,{srcPage:b,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:S,nextConfig:x,parsedUrl:A,isDraftMode:T,prerenderManifest:N,routerServerContext:P,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,resolvedPathname:I,clientReferenceManifest:_,serverActionsManifest:H}=E,D=(0,s.normalizeAppPath)(b),U=!!N.routes[I]&&(w.isDev||(0,g.isRouteCacheOwner)(I,w.cacheOwner,N.routes[I])),M=!!(N.dynamicRoutes[D]||U),z=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,A,!1):t.end("This page could not be found"),null);if(M&&!T){let e=N.dynamicRoutes[D];if(e&&!1===e.fallback&&!U){if(x.adapterPath)return await z();throw new R.NoFallbackError}}let k=null;!M||w.isDev||T||(k="/index"===(k=I)?"/":k);let F=!0===w.isDev||!M,j=M&&!F;H&&_&&(0,o.setManifestsSingleton)({page:b,clientReferenceManifest:_,serverActionsManifest:H});let B=e.method||"GET",G=(0,i.getTracer)(),K=G.getActiveScopeSpan(),L=!!(null==P?void 0:P.isWrappedByNextServer),$=!!(0,n.getRequestMeta)(e,"minimalMode"),Y=(0,n.getRequestMeta)(e,"incrementalCache")||await w.getIncrementalCache(e,x,N,$);null==Y||Y.resetRequestCache(),globalThis.__incrementalCache=Y;let V={params:S,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:F,incrementalCache:Y,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>w.onRequestError(e,t,r,n,P)},sharedContext:{buildId:C,deploymentId:y}},X=new l.NodeNextRequest(e),W=new l.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(X,(0,u.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!$&&q&&O&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await w.handle(Z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let i=V.renderOpts.pendingWaitUntil;i&&r.waitUntil&&(r.waitUntil(i),i=void 0);let o=V.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(X,W,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[f.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,r=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=f.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:v.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await w.onRequestError(e,t,{routerKind:"App Router",routePath:b,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:q})},!1,P),t}},Q=async(n,o)=>{try{var s,l;let n=await w.handleResponse({req:e,nextConfig:x,cacheKey:k,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:$});if(!M)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==v.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});$||t.setHeader("x-nextjs-cache",q?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);$&&M||i.delete(f.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(X,W,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await w.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:q})},!1,P),M)throw t;await (0,c.sendResponse)(X,W,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=G.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,s=`${B} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",r),o.updateName(s))})()}};if(L&&K)await Q(K,void 0);else{let t=G.getActiveScopeSpan();await G.withPropagatedContext(e.headers,()=>G.trace(d.BaseServerSpan.handleRequest,{spanName:`${B} ${b}`,kind:i.SpanKind.SERVER,attributes:{"http.method":B,"http.target":e.url}},e=>Q(e,t)),void 0,!L)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:E})},"routeModule",0,w,"serverHooks",0,C,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,E])}];
1
+ module.exports=[51513,e=>e.a(async(t,a)=>{try{var r=e.i(58821),n=e.i(13618),i=e.i(79832),o=e.i(98043),s=e.i(69719),l=e.i(44950),u=e.i(76759),d=e.i(50377),p=t([i,l]);[i,l]=p.then?(await p)():p;let m=(0,d.createLogger)("api:user"),f=s.z.object({name:s.z.string().optional(),email:s.z.string().optional(),password:s.z.string().optional(),educationStage:s.z.string().optional(),enrollmentYear:s.z.number().optional().nullable(),confirmBeforeImport:s.z.boolean().optional(),enableGeogebra:s.z.boolean().optional(),enableSvgAnimation:s.z.boolean().optional(),questionDuplicateThreshold:s.z.number().min(1).max(100).multipleOf(.01).optional()});async function c(){let e=await (0,n.getServerSession)(i.authOptions);if(!e?.user?.email)return(0,u.unauthorized)();try{let t=await o.prisma.user.findUnique({where:{email:e.user.email},select:{name:!0,email:!0,educationStage:!0,enrollmentYear:!0,confirmBeforeImport:!0,enableGeogebra:!0,enableSvgAnimation:!0,questionDuplicateThreshold:!0}});if(!t)return(0,u.notFound)("User not found");return m.debug({user:t},"Returning user profile"),r.NextResponse.json(t)}catch(e){return m.error({error:e},"Failed to fetch user profile"),(0,u.internalError)("Failed to fetch user profile")}}async function h(e){let t=await (0,n.getServerSession)(i.authOptions);if(!t?.user?.email)return(0,u.unauthorized)();try{let a=await e.json(),{name:n,email:i,password:s,educationStage:d,enrollmentYear:p,confirmBeforeImport:c,enableGeogebra:h,enableSvgAnimation:m,questionDuplicateThreshold:R}=f.parse(a),g={};if(n&&n.trim()&&(g.name=n.trim()),d&&d.trim()&&(g.educationStage=d.trim()),"number"!=typeof p||isNaN(p)||(g.enrollmentYear=p),"boolean"==typeof c&&(g.confirmBeforeImport=c),"boolean"==typeof h&&(g.enableGeogebra=h),"boolean"==typeof m&&(g.enableSvgAnimation=m),"number"==typeof R&&(g.questionDuplicateThreshold=R),i&&i.trim()){if(!/^[^\s@]+@[^\s@]+$/.test(i.trim()))return(0,u.badRequest)("Invalid email format");g.email=i.trim()}if(s&&s.length>0){if(s.length<6)return(0,u.badRequest)("Password must be at least 6 characters");g.password=await (0,l.hash)(s,10)}let v=await o.prisma.user.update({where:{email:t.user.email},data:g,select:{name:!0,email:!0,educationStage:!0,enrollmentYear:!0,confirmBeforeImport:!0,enableGeogebra:!0,enableSvgAnimation:!0,questionDuplicateThreshold:!0}});return r.NextResponse.json(v)}catch(e){if(m.error({error:e},"Failed to update user profile"),e instanceof s.z.ZodError)return(0,u.validationError)("Invalid input",e.issues);return(0,u.internalError)("Failed to update user profile")}}e.s(["GET",0,c,"PATCH",0,h]),a()}catch(e){a(e)}},!1),4123,e=>{"use strict";var t=e.i(47909),a=e.i(74017),r=e.i(96250),n=e.i(59756),i=e.i(61916),o=e.i(74677),s=e.i(69741),l=e.i(16795),u=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),m=e.i(74838),f=e.i(10372),R=e.i(93695),g=e.i(9580);e.i(52474);var v=e.i(220);let w=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/user/route",pathname:"/api/user",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/user/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(51513),...{}}),{workAsyncStorage:b,workUnitAsyncStorage:E,serverHooks:C}=w;async function y(e,t,r){r.requestMeta&&(0,n.setRequestMeta)(e,r.requestMeta),w.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let b="/api/user/route";b=b.replace(/\/index$/,"")||"/";let E=await w.prepare(e,t,{srcPage:b,multiZoneDraftMode:!1});if(!E)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:C,deploymentId:y,params:S,nextConfig:x,parsedUrl:A,isDraftMode:T,prerenderManifest:N,routerServerContext:P,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,resolvedPathname:I,clientReferenceManifest:_,serverActionsManifest:H}=E,D=(0,s.normalizeAppPath)(b),U=!!N.routes[I]&&(w.isDev||(0,g.isRouteCacheOwner)(I,w.cacheOwner,N.routes[I])),M=!!(N.dynamicRoutes[D]||U),z=async()=>((null==P?void 0:P.render404)?await P.render404(e,t,A,!1):t.end("This page could not be found"),null);if(M&&!T){let e=N.dynamicRoutes[D];if(e&&!1===e.fallback&&!U){if(x.adapterPath)return await z();throw new R.NoFallbackError}}let k=null;!M||w.isDev||T||(k="/index"===(k=I)?"/":k);let F=!0===w.isDev||!M,j=M&&!F;H&&_&&(0,o.setManifestsSingleton)({page:b,clientReferenceManifest:_,serverActionsManifest:H});let B=e.method||"GET",G=(0,i.getTracer)(),K=G.getActiveScopeSpan(),L=!!(null==P?void 0:P.isWrappedByNextServer),$=!!(0,n.getRequestMeta)(e,"minimalMode"),Y=(0,n.getRequestMeta)(e,"incrementalCache")||await w.getIncrementalCache(e,x,N,$);null==Y||Y.resetRequestCache(),globalThis.__incrementalCache=Y;let V={params:S,previewProps:N.preview,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts,useCacheTimeout:x.experimental.useCacheTimeout},cacheComponents:!!x.cacheComponents,validationLevel:x.experimental.instantInsights.validationLevel,isDraftMode:T,supportsDynamicResponse:F,incrementalCache:Y,hmrRefreshHash:(0,n.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:x.cacheLife,staticPageGenerationTimeout:x.staticPageGenerationTimeout,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>w.onRequestError(e,t,r,n,P)},sharedContext:{buildId:C,deploymentId:y}},X=new l.NodeNextRequest(e),W=new l.NodeNextResponse(t),Z=u.NextRequestAdapter.fromNodeNextRequest(X,(0,u.signalFromNodeResponse)(t)),J=async({previousCacheEntry:a})=>{try{if(!$&&q&&O&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await w.handle(Z,V);e.fetchMetrics=V.renderOpts.fetchMetrics;let i=V.renderOpts.pendingWaitUntil;i&&r.waitUntil&&(r.waitUntil(i),i=void 0);let o=V.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(X,W,n,i),null;{let e=await n.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(n.headers);o&&(t[f.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==V.renderOpts.collectedRevalidate&&!(V.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&V.renderOpts.collectedRevalidate,r=void 0===V.renderOpts.collectedExpire||V.renderOpts.collectedExpire>=f.INFINITE_CACHE?!1!==a&&a>0?x.expireTime:void 0:V.renderOpts.collectedExpire;return{value:{kind:v.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:r}}}}catch(t){throw(null==a?void 0:a.isStale)&&await w.onRequestError(e,t,{routerKind:"App Router",routePath:b,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:q})},!1,P),t}},Q=async(n,o)=>{try{var s,l;let n=await w.handleResponse({req:e,nextConfig:x,cacheKey:k,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:N,isRoutePPREnabled:!1,isOnDemandRevalidate:q,revalidateOnlyGenerated:O,responseGenerator:J,waitUntil:r.waitUntil,isMinimalMode:$});if(!M)return;if((null==n||null==(s=n.value)?void 0:s.kind)!==v.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==n||null==(l=n.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});$||t.setHeader("x-nextjs-cache",q?"REVALIDATED":n.isMiss?"MISS":n.isStale?"STALE":"HIT"),T&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let i=(0,h.fromNodeOutgoingHttpHeaders)(n.value.headers);$&&M||i.delete(f.NEXT_CACHE_TAGS_HEADER),!n.cacheControl||t.getHeader("Cache-Control")||i.get("Cache-Control")||i.set("Cache-Control",(0,m.getCacheControlHeader)(n.cacheControl)),await (0,c.sendResponse)(X,W,new Response(n.value.body,{headers:i,status:n.value.status||200}));return}catch(t){if(t instanceof R.NoFallbackError||await w.onRequestError(e,t,{routerKind:"App Router",routePath:D,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:q})},!1,P),M)throw t;await (0,c.sendResponse)(X,W,new Response(null,{status:500}));return}finally{(()=>{if(!n)return;let e=t.statusCode;n.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(n.setStatus({code:i.SpanStatusCode.ERROR}),n.setAttribute("error.type",e.toString()));let a=G.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let r=a.get("next.route")||D,s=`${B} ${r}`;n.setAttributes({"next.route":r,"http.route":r,"next.span_name":s}),n.updateName(s),o&&o!==n&&(o.setAttribute("http.route",r),o.updateName(s))})()}};if(L&&K)await Q(K,void 0);else{let t=G.getActiveScopeSpan();await G.withPropagatedContext(e.headers,()=>G.trace(d.BaseServerSpan.handleRequest,{spanName:`${B} ${b}`,kind:i.SpanKind.SERVER,attributes:{"http.method":B,"http.target":e.url}},e=>Q(e,t)),void 0,!L)}}e.s(["handler",0,y,"patchFetch",0,function(){return(0,r.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:E})},"routeModule",0,w,"serverHooks",0,C,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,E])}];
2
2
 
3
3
  //# sourceMappingURL=_1oj6gy_._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[136189,e=>e.a(async(t,a)=>{try{var i=e.i(89171),r=e.i(757660),n=e.i(79832),o=e.i(258078),s=e.i(798003),u=e.i(181912),l=e.i(50377),d=e.i(376025),p=e.i(298876),c=t([n]);[n]=c.then?(await c)():c;let g=(0,l.createLogger)("api:settings");async function h(){let e=await (0,r.getServerSession)(n.authOptions);if(!e?.user)return(0,u.unauthorized)("Authentication required");let t=(0,s.getAppConfig)();return(0,o.requireAdmin)(e)?i.NextResponse.json(t):i.NextResponse.json({aiProvider:t.aiProvider,timeouts:t.timeouts,timeZone:t.timeZone})}async function R(e){let t=await (0,r.getServerSession)(n.authOptions);if(!t?.user)return(0,u.unauthorized)("Authentication required");if(!(0,o.requireAdmin)(t))return(0,u.forbidden)("Admin access required");try{let t=await e.json();if(void 0!==t.timeZone){if(!(0,d.isValidTimeZone)(t.timeZone))return(0,u.badRequest)("INVALID_TIME_ZONE");t.timeZone=t.timeZone.trim()}let a=(0,s.getAppConfig)();if(t.gemini?.apiKey==="********"&&(t.gemini.apiKey=a.gemini?.apiKey),t.openai?.instances){let e=a.openai?.instances||[];t.openai.instances=t.openai.instances.map(t=>{if("********"===t.apiKey){let a=e.find(e=>e.id===t.id);return{...t,apiKey:a?.apiKey||""}}return t})}for(let e of(t.azure?.apiKey==="********"&&(t.azure.apiKey=a.azure?.apiKey),t.anthropic?.apiKey==="********"&&(t.anthropic.apiKey=a.anthropic?.apiKey),p.VENDOR_PROVIDER_IDS))t[e]?.apiKey==="********"&&(t[e].apiKey=a[e]?.apiKey);let r=(0,s.updateAppConfig)(t);return i.NextResponse.json(r)}catch(e){return g.error({error:e},"Failed to update settings"),(0,u.internalError)("Failed to update settings")}}e.s(["GET",0,h,"POST",0,R,"dynamic",0,"force-dynamic"]),a()}catch(e){a(e)}},!1),561525,e=>{"use strict";var t=e.i(747909),a=e.i(174017),i=e.i(996250),r=e.i(759756),n=e.i(561916),o=e.i(174677),s=e.i(869741),u=e.i(316795),l=e.i(487718),d=e.i(995169),p=e.i(47587),c=e.i(666012),h=e.i(570101),R=e.i(626937),g=e.i(10372),m=e.i(193695),v=e.i(509580);e.i(52474);var f=e.i(600220);let y=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/settings/route",pathname:"/api/settings",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/settings/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(136189),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:w,serverHooks:C}=y;async function A(e,t,i){i.requestMeta&&(0,r.setRequestMeta)(e,i.requestMeta),y.isDev&&(0,r.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/settings/route";E=E.replace(/\/index$/,"")||"/";let w=await y.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:C,deploymentId:A,params:x,nextConfig:T,parsedUrl:S,isDraftMode:N,prerenderManifest:P,routerServerContext:O,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,resolvedPathname:q,clientReferenceManifest:K,serverActionsManifest:I}=w,H=(0,s.normalizeAppPath)(E),D=!!P.routes[q]&&(y.isDev||(0,v.isRouteCacheOwner)(q,y.cacheOwner,P.routes[q])),M=!!(P.dynamicRoutes[H]||D),U=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,S,!1):t.end("This page could not be found"),null);if(M&&!N){let e=P.dynamicRoutes[H];if(e&&!1===e.fallback&&!D){if(T.adapterPath)return await U();throw new m.NoFallbackError}}let k=null;!M||y.isDev||N||(k="/index"===(k=q)?"/":k);let j=!0===y.isDev||!M,F=M&&!j;I&&K&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:K,serverActionsManifest:I});let L=e.method||"GET",Z=(0,n.getTracer)(),V=Z.getActiveScopeSpan(),$=!!(null==O?void 0:O.isWrappedByNextServer),z=!!(0,r.getRequestMeta)(e,"minimalMode"),B=(0,r.getRequestMeta)(e,"incrementalCache")||await y.getIncrementalCache(e,T,P,z);null==B||B.resetRequestCache(),globalThis.__incrementalCache=B;let G={params:x,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:N,supportsDynamicResponse:j,incrementalCache:B,hmrRefreshHash:(0,r.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:i.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,i,r)=>y.onRequestError(e,t,i,r,O)},sharedContext:{buildId:C,deploymentId:A}},X=new u.NodeNextRequest(e),W=new u.NodeNextResponse(t),J=l.NextRequestAdapter.fromNodeNextRequest(X,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:a})=>{try{if(!z&&b&&_&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let r=await y.handle(J,G);e.fetchMetrics=G.renderOpts.fetchMetrics;let n=G.renderOpts.pendingWaitUntil;n&&i.waitUntil&&(i.waitUntil(n),n=void 0);let o=G.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(X,W,r,n),null;{let e=await r.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(r.headers);o&&(t[g.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,i=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=g.INFINITE_CACHE?!1!==a&&a>0?T.expireTime:void 0:G.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:r.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:i}}}}catch(t){throw(null==a?void 0:a.isStale)&&await y.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:b})},!1,O),t}},Y=async(r,o)=>{try{var s,u;let r=await y.handleResponse({req:e,nextConfig:T,cacheKey:k,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,responseGenerator:Q,waitUntil:i.waitUntil,isMinimalMode:z});if(!M)return;if((null==r||null==(s=r.value)?void 0:s.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==r||null==(u=r.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});z||t.setHeader("x-nextjs-cache",b?"REVALIDATED":r.isMiss?"MISS":r.isStale?"STALE":"HIT"),N&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let n=(0,h.fromNodeOutgoingHttpHeaders)(r.value.headers);z&&M||n.delete(g.NEXT_CACHE_TAGS_HEADER),!r.cacheControl||t.getHeader("Cache-Control")||n.get("Cache-Control")||n.set("Cache-Control",(0,R.getCacheControlHeader)(r.cacheControl)),await (0,c.sendResponse)(X,W,new Response(r.value.body,{headers:n,status:r.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await y.onRequestError(e,t,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:b})},!1,O),M)throw t;await (0,c.sendResponse)(X,W,new Response(null,{status:500}));return}finally{(()=>{if(!r)return;let e=t.statusCode;r.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(r.setStatus({code:n.SpanStatusCode.ERROR}),r.setAttribute("error.type",e.toString()));let a=Z.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=a.get("next.route")||H,s=`${L} ${i}`;r.setAttributes({"next.route":i,"http.route":i,"next.span_name":s}),r.updateName(s),o&&o!==r&&(o.setAttribute("http.route",i),o.updateName(s))})()}};if($&&V)await Y(V,void 0);else{let t=Z.getActiveScopeSpan();await Z.withPropagatedContext(e.headers,()=>Z.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${E}`,kind:n.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,A,"patchFetch",0,function(){return(0,i.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:w})},"routeModule",0,y,"serverHooks",0,C,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,w])}];
1
+ module.exports=[36189,e=>e.a(async(t,a)=>{try{var i=e.i(58821),r=e.i(13618),n=e.i(79832),o=e.i(58078),s=e.i(98003),u=e.i(76759),l=e.i(50377),d=e.i(76025),p=e.i(98876),c=t([n]);[n]=c.then?(await c)():c;let g=(0,l.createLogger)("api:settings");async function h(){let e=await (0,r.getServerSession)(n.authOptions);if(!e?.user)return(0,u.unauthorized)("Authentication required");let t=(0,s.getAppConfig)();return(0,o.requireAdmin)(e)?i.NextResponse.json(t):i.NextResponse.json({aiProvider:t.aiProvider,timeouts:t.timeouts,timeZone:t.timeZone})}async function R(e){let t=await (0,r.getServerSession)(n.authOptions);if(!t?.user)return(0,u.unauthorized)("Authentication required");if(!(0,o.requireAdmin)(t))return(0,u.forbidden)("Admin access required");try{let t=await e.json();if(void 0!==t.timeZone){if(!(0,d.isValidTimeZone)(t.timeZone))return(0,u.badRequest)("INVALID_TIME_ZONE");t.timeZone=t.timeZone.trim()}let a=(0,s.getAppConfig)();if(t.gemini?.apiKey==="********"&&(t.gemini.apiKey=a.gemini?.apiKey),t.openai?.instances){let e=a.openai?.instances||[];t.openai.instances=t.openai.instances.map(t=>{if("********"===t.apiKey){let a=e.find(e=>e.id===t.id);return{...t,apiKey:a?.apiKey||""}}return t})}for(let e of(t.azure?.apiKey==="********"&&(t.azure.apiKey=a.azure?.apiKey),t.anthropic?.apiKey==="********"&&(t.anthropic.apiKey=a.anthropic?.apiKey),p.VENDOR_PROVIDER_IDS))t[e]?.apiKey==="********"&&(t[e].apiKey=a[e]?.apiKey);let r=(0,s.updateAppConfig)(t);return i.NextResponse.json(r)}catch(e){return g.error({error:e},"Failed to update settings"),(0,u.internalError)("Failed to update settings")}}e.s(["GET",0,h,"POST",0,R,"dynamic",0,"force-dynamic"]),a()}catch(e){a(e)}},!1),61525,e=>{"use strict";var t=e.i(47909),a=e.i(74017),i=e.i(96250),r=e.i(59756),n=e.i(61916),o=e.i(74677),s=e.i(69741),u=e.i(16795),l=e.i(87718),d=e.i(95169),p=e.i(47587),c=e.i(66012),h=e.i(70101),R=e.i(74838),g=e.i(10372),m=e.i(93695),v=e.i(9580);e.i(52474);var f=e.i(220);let y=new t.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/settings/route",pathname:"/api/settings",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/settings/route.ts",nextConfigOutput:"standalone",userland:()=>e.r(36189),...{}}),{workAsyncStorage:E,workUnitAsyncStorage:w,serverHooks:C}=y;async function A(e,t,i){i.requestMeta&&(0,r.setRequestMeta)(e,i.requestMeta),y.isDev&&(0,r.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let E="/api/settings/route";E=E.replace(/\/index$/,"")||"/";let w=await y.prepare(e,t,{srcPage:E,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==i.waitUntil||i.waitUntil.call(i,Promise.resolve()),null;let{buildId:C,deploymentId:A,params:x,nextConfig:T,parsedUrl:S,isDraftMode:N,prerenderManifest:P,routerServerContext:O,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,resolvedPathname:q,clientReferenceManifest:K,serverActionsManifest:I}=w,H=(0,s.normalizeAppPath)(E),D=!!P.routes[q]&&(y.isDev||(0,v.isRouteCacheOwner)(q,y.cacheOwner,P.routes[q])),M=!!(P.dynamicRoutes[H]||D),U=async()=>((null==O?void 0:O.render404)?await O.render404(e,t,S,!1):t.end("This page could not be found"),null);if(M&&!N){let e=P.dynamicRoutes[H];if(e&&!1===e.fallback&&!D){if(T.adapterPath)return await U();throw new m.NoFallbackError}}let k=null;!M||y.isDev||N||(k="/index"===(k=q)?"/":k);let j=!0===y.isDev||!M,F=M&&!j;I&&K&&(0,o.setManifestsSingleton)({page:E,clientReferenceManifest:K,serverActionsManifest:I});let L=e.method||"GET",Z=(0,n.getTracer)(),V=Z.getActiveScopeSpan(),$=!!(null==O?void 0:O.isWrappedByNextServer),z=!!(0,r.getRequestMeta)(e,"minimalMode"),B=(0,r.getRequestMeta)(e,"incrementalCache")||await y.getIncrementalCache(e,T,P,z);null==B||B.resetRequestCache(),globalThis.__incrementalCache=B;let G={params:x,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!T.experimental.authInterrupts,useCacheTimeout:T.experimental.useCacheTimeout},cacheComponents:!!T.cacheComponents,validationLevel:T.experimental.instantInsights.validationLevel,isDraftMode:N,supportsDynamicResponse:j,incrementalCache:B,hmrRefreshHash:(0,r.getRequestMeta)(e,"hmrRefreshHash"),cacheLifeProfiles:T.cacheLife,staticPageGenerationTimeout:T.staticPageGenerationTimeout,waitUntil:i.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,i,r)=>y.onRequestError(e,t,i,r,O)},sharedContext:{buildId:C,deploymentId:A}},X=new u.NodeNextRequest(e),W=new u.NodeNextResponse(t),J=l.NextRequestAdapter.fromNodeNextRequest(X,(0,l.signalFromNodeResponse)(t)),Q=async({previousCacheEntry:a})=>{try{if(!z&&b&&_&&!a)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let r=await y.handle(J,G);e.fetchMetrics=G.renderOpts.fetchMetrics;let n=G.renderOpts.pendingWaitUntil;n&&i.waitUntil&&(i.waitUntil(n),n=void 0);let o=G.renderOpts.collectedTags;if(!M)return await (0,c.sendResponse)(X,W,r,n),null;{let e=await r.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(r.headers);o&&(t[g.NEXT_CACHE_TAGS_HEADER]=o),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=g.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,i=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=g.INFINITE_CACHE?!1!==a&&a>0?T.expireTime:void 0:G.renderOpts.collectedExpire;return{value:{kind:f.CachedRouteKind.APP_ROUTE,status:r.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:i}}}}catch(t){throw(null==a?void 0:a.isStale)&&await y.onRequestError(e,t,{routerKind:"App Router",routePath:E,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:b})},!1,O),t}},Y=async(r,o)=>{try{var s,u;let r=await y.handleResponse({req:e,nextConfig:T,cacheKey:k,routeKind:a.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,responseGenerator:Q,waitUntil:i.waitUntil,isMinimalMode:z});if(!M)return;if((null==r||null==(s=r.value)?void 0:s.kind)!==f.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==r||null==(u=r.value)?void 0:u.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});z||t.setHeader("x-nextjs-cache",b?"REVALIDATED":r.isMiss?"MISS":r.isStale?"STALE":"HIT"),N&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let n=(0,h.fromNodeOutgoingHttpHeaders)(r.value.headers);z&&M||n.delete(g.NEXT_CACHE_TAGS_HEADER),!r.cacheControl||t.getHeader("Cache-Control")||n.get("Cache-Control")||n.set("Cache-Control",(0,R.getCacheControlHeader)(r.cacheControl)),await (0,c.sendResponse)(X,W,new Response(r.value.body,{headers:n,status:r.value.status||200}));return}catch(t){if(t instanceof m.NoFallbackError||await y.onRequestError(e,t,{routerKind:"App Router",routePath:H,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:F,isOnDemandRevalidate:b})},!1,O),M)throw t;await (0,c.sendResponse)(X,W,new Response(null,{status:500}));return}finally{(()=>{if(!r)return;let e=t.statusCode;r.setAttributes({"http.status_code":e,"next.rsc":!1}),e&&e>=500&&(r.setStatus({code:n.SpanStatusCode.ERROR}),r.setAttribute("error.type",e.toString()));let a=Z.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==d.BaseServerSpan.handleRequest)return console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=a.get("next.route")||H,s=`${L} ${i}`;r.setAttributes({"next.route":i,"http.route":i,"next.span_name":s}),r.updateName(s),o&&o!==r&&(o.setAttribute("http.route",i),o.updateName(s))})()}};if($&&V)await Y(V,void 0);else{let t=Z.getActiveScopeSpan();await Z.withPropagatedContext(e.headers,()=>Z.trace(d.BaseServerSpan.handleRequest,{spanName:`${L} ${E}`,kind:n.SpanKind.SERVER,attributes:{"http.method":L,"http.target":e.url}},e=>Y(e,t)),void 0,!$)}}e.s(["handler",0,A,"patchFetch",0,function(){return(0,i.patchFetch)({workAsyncStorage:E,workUnitAsyncStorage:w})},"routeModule",0,y,"serverHooks",0,C,"workAsyncStorage",0,E,"workUnitAsyncStorage",0,w])}];
2
2
 
3
3
  //# sourceMappingURL=_1pvqo-q._.js.map