academe-kit 0.11.5 → 0.11.7

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.
package/dist/index.d.ts CHANGED
@@ -124,6 +124,8 @@ interface AcademeLoadingColors {
124
124
  /** Círculo branco ("face"). */
125
125
  white: string;
126
126
  }
127
+ /** Tema visual da vinheta. `light` (default) preserva o fundo claro atual; `dark` usa o fundo escuro da marca. */
128
+ type AcademeLoadingTheme = "light" | "dark";
127
129
  interface AcademeLoadingProps {
128
130
  /** Lado do palco quadrado, em px. Default 320. */
129
131
  size?: number;
@@ -140,12 +142,17 @@ interface AcademeLoadingProps {
140
142
  pulseWhileLoading?: boolean;
141
143
  /** Chamado ao concluir (após a saída, ou após a vinheta completa). */
142
144
  onFinish?: () => void;
143
- /** Sobrescreve tokens de cor (merge com os defaults medidos do vídeo). */
145
+ /**
146
+ * Tema visual base. `light` (default) mantém o fundo claro atual; `dark` aplica
147
+ * a paleta escura da marca. O `colors` ainda sobrescreve qualquer token por cima.
148
+ */
149
+ theme?: AcademeLoadingTheme;
150
+ /** Sobrescreve tokens de cor (merge com os defaults do tema selecionado). */
144
151
  colors?: Partial<AcademeLoadingColors>;
145
152
  className?: string;
146
153
  style?: React.CSSProperties;
147
154
  }
148
- declare function AcademeLoading({ size, duration, loading, autoPlay, pulseWhileLoading, onFinish, colors, className, style, }: AcademeLoadingProps): react_jsx_runtime.JSX.Element;
155
+ declare function AcademeLoading({ size, duration, loading, autoPlay, pulseWhileLoading, onFinish, theme, colors, className, style, }: AcademeLoadingProps): react_jsx_runtime.JSX.Element;
149
156
 
150
157
  interface LogoAProps {
151
158
  /** Altura do logo em px (no palco corresponde a ~0.46·S). Largura é derivada
@@ -3036,6 +3043,94 @@ interface paths {
3036
3043
  patch?: never;
3037
3044
  trace?: never;
3038
3045
  };
3046
+ "/challenges/{id}/participants": {
3047
+ parameters: {
3048
+ query?: never;
3049
+ header?: never;
3050
+ path?: never;
3051
+ cookie?: never;
3052
+ };
3053
+ /**
3054
+ * List the students taking part in this challenge
3055
+ * @description Returns the roster of students for the challenge along with each
3056
+ * student's status, derived from `submissions` (latest attempt) and
3057
+ * `user_challenge_progress` (whether any step was started).
3058
+ *
3059
+ * The roster is built from `institution_registration` rows of the given
3060
+ * institution, filtered by the challenge's serie. `institutionId` and
3061
+ * `serieId` may be supplied via query to provide the viewing context —
3062
+ * useful for global template challenges (`institution_id IS NULL`) shown
3063
+ * via fallback in the pedagogical portal. They default to the
3064
+ * challenge's own institution/serie when omitted.
3065
+ *
3066
+ * Status values: `novo` (not started), `andamento` (started a step, no
3067
+ * submission), `entregue` (submitted | ai_evaluated), `aprovado`
3068
+ * (approved), `rejeitado` (rejected).
3069
+ */
3070
+ get: {
3071
+ parameters: {
3072
+ query?: {
3073
+ /** @description Viewing institution. Defaults to the challenge's institution. */
3074
+ institutionId?: string;
3075
+ /** @description Serie filter. Defaults to the challenge's serie. */
3076
+ serieId?: string;
3077
+ };
3078
+ header?: never;
3079
+ path: {
3080
+ /** @description Resource ID */
3081
+ id: components["parameters"]["id"];
3082
+ };
3083
+ cookie?: never;
3084
+ };
3085
+ requestBody?: never;
3086
+ responses: {
3087
+ /** @description Roster of participants with derived status */
3088
+ 200: {
3089
+ headers: {
3090
+ [name: string]: unknown;
3091
+ };
3092
+ content: {
3093
+ "application/json": {
3094
+ /** @example success */
3095
+ status?: string;
3096
+ data?: {
3097
+ totalStudents?: number;
3098
+ classrooms?: {
3099
+ /** Format: uuid */
3100
+ id?: string;
3101
+ name?: string;
3102
+ count?: number;
3103
+ }[];
3104
+ participants?: {
3105
+ /** Format: uuid */
3106
+ userId?: string;
3107
+ name?: string;
3108
+ email?: string | null;
3109
+ avatarUrl?: string | null;
3110
+ /** Format: uuid */
3111
+ classroomId?: string | null;
3112
+ classroomName?: string | null;
3113
+ /** @enum {string} */
3114
+ status?: "novo" | "andamento" | "entregue" | "aprovado" | "rejeitado";
3115
+ /** Format: uuid */
3116
+ submissionId?: string | null;
3117
+ }[];
3118
+ };
3119
+ };
3120
+ };
3121
+ };
3122
+ 401: components["responses"]["Unauthorized"];
3123
+ 404: components["responses"]["NotFound"];
3124
+ };
3125
+ };
3126
+ put?: never;
3127
+ post?: never;
3128
+ delete?: never;
3129
+ options?: never;
3130
+ head?: never;
3131
+ patch?: never;
3132
+ trace?: never;
3133
+ };
3039
3134
  "/classrooms": {
3040
3135
  parameters: {
3041
3136
  query?: never;
@@ -9804,6 +9899,67 @@ interface paths {
9804
9899
  patch?: never;
9805
9900
  trace?: never;
9806
9901
  };
9902
+ "/quiz-questions/bulk": {
9903
+ parameters: {
9904
+ query?: never;
9905
+ header?: never;
9906
+ path?: never;
9907
+ cookie?: never;
9908
+ };
9909
+ get?: never;
9910
+ put?: never;
9911
+ /**
9912
+ * Bulk create quiz questions
9913
+ * @description Cria várias perguntas (com respostas) de uma vez para um quiz.
9914
+ */
9915
+ post: {
9916
+ parameters: {
9917
+ query?: never;
9918
+ header?: never;
9919
+ path?: never;
9920
+ cookie?: never;
9921
+ };
9922
+ requestBody: {
9923
+ content: {
9924
+ "application/json": {
9925
+ quizId: string;
9926
+ questions: {
9927
+ text: string;
9928
+ type: "multiple_choice" | "true_false" | "open";
9929
+ points?: number;
9930
+ options?: {
9931
+ text: string;
9932
+ is_correct: boolean;
9933
+ }[];
9934
+ }[];
9935
+ };
9936
+ };
9937
+ };
9938
+ responses: {
9939
+ /** @description Questions created */
9940
+ 201: {
9941
+ headers: {
9942
+ [name: string]: unknown;
9943
+ };
9944
+ content: {
9945
+ "application/json": {
9946
+ /** @example success */
9947
+ status?: string;
9948
+ data?: components["schemas"]["QuizQuestion"][];
9949
+ };
9950
+ };
9951
+ };
9952
+ 400: components["responses"]["BadRequest"];
9953
+ 401: components["responses"]["Unauthorized"];
9954
+ 500: components["responses"]["ServerError"];
9955
+ };
9956
+ };
9957
+ delete?: never;
9958
+ options?: never;
9959
+ head?: never;
9960
+ patch?: never;
9961
+ trace?: never;
9962
+ };
9807
9963
  "/quiz-questions/{id}": {
9808
9964
  parameters: {
9809
9965
  query?: never;
@@ -10016,6 +10172,145 @@ interface paths {
10016
10172
  patch?: never;
10017
10173
  trace?: never;
10018
10174
  };
10175
+ "/quiz/with-context": {
10176
+ parameters: {
10177
+ query?: never;
10178
+ header?: never;
10179
+ path?: never;
10180
+ cookie?: never;
10181
+ };
10182
+ /**
10183
+ * List quizzes with course/module/category context
10184
+ * @description Retrieve a paginated list of quizzes, each enriched with the course, module and category it belongs to. `context` is null for standalone quizzes.
10185
+ */
10186
+ get: {
10187
+ parameters: {
10188
+ query?: {
10189
+ /** @description Filter by quiz title */
10190
+ title?: string;
10191
+ /** @description Filter by active status */
10192
+ isActive?: boolean;
10193
+ /** @description Filter by creator user ID */
10194
+ createdBy?: string;
10195
+ /** @description Search in title */
10196
+ search?: string;
10197
+ /** @description Page number */
10198
+ page?: number;
10199
+ /** @description Items per page */
10200
+ limit?: number;
10201
+ };
10202
+ header?: never;
10203
+ path?: never;
10204
+ cookie?: never;
10205
+ };
10206
+ requestBody?: never;
10207
+ responses: {
10208
+ /** @description List of quizzes with context */
10209
+ 200: {
10210
+ headers: {
10211
+ [name: string]: unknown;
10212
+ };
10213
+ content: {
10214
+ "application/json": {
10215
+ /** @example success */
10216
+ status?: string;
10217
+ data?: (components["schemas"]["Quiz"] & {
10218
+ context?: {
10219
+ course?: {
10220
+ id?: string;
10221
+ title?: string;
10222
+ } | null;
10223
+ module?: {
10224
+ id?: string;
10225
+ title?: string;
10226
+ } | null;
10227
+ category?: {
10228
+ id?: string;
10229
+ name?: string;
10230
+ color?: string | null;
10231
+ } | null;
10232
+ } | null;
10233
+ })[];
10234
+ meta?: components["schemas"]["PaginationMeta"];
10235
+ };
10236
+ };
10237
+ };
10238
+ 401: components["responses"]["Unauthorized"];
10239
+ 500: components["responses"]["ServerError"];
10240
+ };
10241
+ };
10242
+ put?: never;
10243
+ post?: never;
10244
+ delete?: never;
10245
+ options?: never;
10246
+ head?: never;
10247
+ patch?: never;
10248
+ trace?: never;
10249
+ };
10250
+ "/quiz/generate-questions": {
10251
+ parameters: {
10252
+ query?: never;
10253
+ header?: never;
10254
+ path?: never;
10255
+ cookie?: never;
10256
+ };
10257
+ get?: never;
10258
+ put?: never;
10259
+ /**
10260
+ * Generate quiz questions with AI
10261
+ * @description Gera perguntas a partir de um texto base via IA. Não persiste — apenas devolve.
10262
+ */
10263
+ post: {
10264
+ parameters: {
10265
+ query?: never;
10266
+ header?: never;
10267
+ path?: never;
10268
+ cookie?: never;
10269
+ };
10270
+ requestBody: {
10271
+ content: {
10272
+ "application/json": {
10273
+ text: string;
10274
+ numQuestions: number;
10275
+ difficulty?: "facil" | "normal" | "dificil";
10276
+ existingQuestions?: string[];
10277
+ model?: string;
10278
+ };
10279
+ };
10280
+ };
10281
+ responses: {
10282
+ /** @description Generated questions */
10283
+ 200: {
10284
+ headers: {
10285
+ [name: string]: unknown;
10286
+ };
10287
+ content: {
10288
+ "application/json": {
10289
+ /** @example success */
10290
+ status?: string;
10291
+ data?: {
10292
+ question_text: string;
10293
+ question_type: "multiple_choice" | "true_false";
10294
+ points: number;
10295
+ options: {
10296
+ text: string;
10297
+ is_correct: boolean;
10298
+ }[];
10299
+ }[];
10300
+ };
10301
+ };
10302
+ };
10303
+ 400: components["responses"]["BadRequest"];
10304
+ 401: components["responses"]["Unauthorized"];
10305
+ 500: components["responses"]["ServerError"];
10306
+ };
10307
+ };
10308
+ delete?: never;
10309
+ options?: never;
10310
+ head?: never;
10311
+ patch?: never;
10312
+ trace?: never;
10313
+ };
10019
10314
  "/quiz/{id}": {
10020
10315
  parameters: {
10021
10316
  query?: never;
@@ -11983,6 +12278,12 @@ interface paths {
11983
12278
  * - Cannot create after status=approved
11984
12279
  * - Cannot exceed challenge.maxSubmissionsAttempts
11985
12280
  * - attempt_number is computed server-side with a row lock (FOR UPDATE)
12281
+ *
12282
+ * When `items` is provided, the submission and its files/links are persisted
12283
+ * in the SAME transaction (atomic) and AI evaluation is dispatched after commit.
12284
+ * Each item must have exactly ONE of fileId or url, and must match the
12285
+ * challenge.submissionType (file types require fileId; links require url).
12286
+ * This is the preferred path for clients (no separate POST /submissions/{id}/files).
11986
12287
  */
11987
12288
  post: {
11988
12289
  parameters: {
@@ -12007,6 +12308,17 @@ interface paths {
12007
12308
  */
12008
12309
  groupId?: string;
12009
12310
  description?: string;
12311
+ /**
12312
+ * @description Submission delivery. When present, files/links are stored atomically
12313
+ * with the submission and AI evaluation is dispatched after commit.
12314
+ */
12315
+ items?: {
12316
+ /** Format: uuid */
12317
+ fileId?: string | null;
12318
+ /** Format: uri */
12319
+ url?: string | null;
12320
+ index?: number;
12321
+ }[];
12010
12322
  };
12011
12323
  };
12012
12324
  };
@@ -12021,6 +12333,45 @@ interface paths {
12021
12333
  /** @example success */
12022
12334
  status?: string;
12023
12335
  data?: components["schemas"]["Submission"];
12336
+ /**
12337
+ * @description Journey side-effects of the submission. On the FIRST attempt the
12338
+ * publication step is completed and the user advances; `advance`
12339
+ * carries the resulting tick so the client can animate the journey.
12340
+ * `advance` is null on re-submissions (attempt > 1) or if the advance
12341
+ * step failed (non-fatal — the submission is still created).
12342
+ */
12343
+ meta?: {
12344
+ advance?: {
12345
+ /** @enum {string} */
12346
+ action?: "started" | "completed" | "finished";
12347
+ /** Format: uuid */
12348
+ challengeId?: string;
12349
+ currentStep?: {
12350
+ /** Format: uuid */
12351
+ id?: string;
12352
+ index?: number;
12353
+ name?: string;
12354
+ /** Format: date-time */
12355
+ startedAt?: string | null;
12356
+ /** Format: date-time */
12357
+ completedAt?: string | null;
12358
+ } | null;
12359
+ nextStep?: {
12360
+ /** Format: uuid */
12361
+ id?: string;
12362
+ index?: number;
12363
+ name?: string;
12364
+ /** Format: date-time */
12365
+ startedAt?: string | null;
12366
+ } | null;
12367
+ autoCompletedSteps?: {
12368
+ /** Format: uuid */
12369
+ id?: string;
12370
+ index?: number;
12371
+ name?: string;
12372
+ }[];
12373
+ } | null;
12374
+ };
12024
12375
  };
12025
12376
  };
12026
12377
  };
@@ -12084,6 +12435,79 @@ interface paths {
12084
12435
  patch?: never;
12085
12436
  trace?: never;
12086
12437
  };
12438
+ "/submissions/{id}/classroom-rank": {
12439
+ parameters: {
12440
+ query?: never;
12441
+ header?: never;
12442
+ path?: never;
12443
+ cookie?: never;
12444
+ };
12445
+ /**
12446
+ * Ordem de entrega do aluno na turma para o desafio desta submissão
12447
+ * @description Retorna a posição do aluno entre os colegas de turma (institution_classroom
12448
+ * via membership) a entregar o desafio, ordenando pela PRIMEIRA entrega de cada
12449
+ * aluno (MIN(submitted_at)). Usado pelo app do aluno como incentivo a entregar
12450
+ * cedo ("Você foi o Nº de X da turma a entregar"). Quando o aluno não tem turma
12451
+ * na instituição, retorna order=0 e classSize=0 e o cliente esconde o card.
12452
+ */
12453
+ get: {
12454
+ parameters: {
12455
+ query?: never;
12456
+ header?: never;
12457
+ path: {
12458
+ /** @description Resource ID */
12459
+ id: components["parameters"]["id"];
12460
+ };
12461
+ cookie?: never;
12462
+ };
12463
+ requestBody?: never;
12464
+ responses: {
12465
+ /** @description Posição na turma */
12466
+ 200: {
12467
+ headers: {
12468
+ [name: string]: unknown;
12469
+ };
12470
+ content: {
12471
+ "application/json": {
12472
+ /** @example success */
12473
+ status?: string;
12474
+ data?: {
12475
+ /**
12476
+ * @description Posição do aluno (1-based) entre os que entregaram; 0 quando sem turma
12477
+ * @example 3
12478
+ */
12479
+ order?: number;
12480
+ /**
12481
+ * @description Total de alunos da turma (independente de terem entregado)
12482
+ * @example 28
12483
+ */
12484
+ classSize?: number;
12485
+ /**
12486
+ * @description Quantos alunos da turma já entregaram o desafio
12487
+ * @example 12
12488
+ */
12489
+ submittedCount?: number;
12490
+ /**
12491
+ * @description true quando order está entre 1 e 3
12492
+ * @example true
12493
+ */
12494
+ earlyBird?: boolean;
12495
+ };
12496
+ };
12497
+ };
12498
+ };
12499
+ 401: components["responses"]["Unauthorized"];
12500
+ 404: components["responses"]["NotFound"];
12501
+ };
12502
+ };
12503
+ put?: never;
12504
+ post?: never;
12505
+ delete?: never;
12506
+ options?: never;
12507
+ head?: never;
12508
+ patch?: never;
12509
+ trace?: never;
12510
+ };
12087
12511
  "/submissions/{id}/files": {
12088
12512
  parameters: {
12089
12513
  query?: never;
@@ -12665,6 +13089,12 @@ interface paths {
12665
13089
  * Útil para pré-visualização administrativa ou quando o aluno pertence a múltiplas séries.
12666
13090
  */
12667
13091
  serieId?: string;
13092
+ /**
13093
+ * @description Escola atual (contexto de instituição do app). Opcional — se omitido, usa a 1ª
13094
+ * matrícula. A jornada é por escola: filtra os challenges e resolve a turma/série
13095
+ * default a partir da membership do usuário NESTA instituição.
13096
+ */
13097
+ institutionId?: string;
12668
13098
  /**
12669
13099
  * @description [Admin] Quando presente, retorna a jornada do usuário-alvo em vez da do
12670
13100
  * autenticado. Usado pelo backoffice para visualizar a jornada de um aluno.
@@ -13562,6 +13992,97 @@ interface paths {
13562
13992
  patch?: never;
13563
13993
  trace?: never;
13564
13994
  };
13995
+ "/users/me/classrooms": {
13996
+ parameters: {
13997
+ query?: never;
13998
+ header?: never;
13999
+ path?: never;
14000
+ cookie?: never;
14001
+ };
14002
+ /**
14003
+ * Turmas e séries do usuário autenticado
14004
+ * @description Contexto de matrícula do aluno: TODAS as suas turmas (com série, turno e
14005
+ * instituição), a escola ATUAL e a lista DEDUPLICADA de séries dessa escola.
14006
+ *
14007
+ * Fonte única para o app: `classrooms` alimenta a listagem de turmas no
14008
+ * perfil; `currentInstitutionId` é a escola atual (o app mostra uma escola
14009
+ * por vez); `series` traz APENAS as séries da escola atual (deduplicada e
14010
+ * ordenada por nível/valor) — alimenta o seletor da jornada, que também é
14011
+ * por escola. O botão só aparece com 2+ séries na escola atual.
14012
+ */
14013
+ get: {
14014
+ parameters: {
14015
+ query?: never;
14016
+ header?: never;
14017
+ path?: never;
14018
+ cookie?: never;
14019
+ };
14020
+ requestBody?: never;
14021
+ responses: {
14022
+ /** @description Turmas + séries acessíveis */
14023
+ 200: {
14024
+ headers: {
14025
+ [name: string]: unknown;
14026
+ };
14027
+ content: {
14028
+ "application/json": {
14029
+ /** @example success */
14030
+ status?: string;
14031
+ data?: {
14032
+ /**
14033
+ * Format: uuid
14034
+ * @description Escola atual (a da matrícula). As séries são desta escola.
14035
+ */
14036
+ currentInstitutionId?: string | null;
14037
+ classrooms?: {
14038
+ /** Format: uuid */
14039
+ institutionClassroomId?: string;
14040
+ /** Format: uuid */
14041
+ classroomId?: string;
14042
+ /** @example 6º A */
14043
+ classroomName?: string;
14044
+ /** @example manhã */
14045
+ shiftName?: string | null;
14046
+ /** Format: uuid */
14047
+ institutionId?: string;
14048
+ /** @example Escola Modelo */
14049
+ institutionName?: string | null;
14050
+ serie?: {
14051
+ /** Format: uuid */
14052
+ serieId?: string;
14053
+ /** @example 6 */
14054
+ serieValue?: number;
14055
+ /** @example 6º ANO */
14056
+ serieLabel?: string;
14057
+ /** @enum {string} */
14058
+ level?: "fundamental" | "medio";
14059
+ } | null;
14060
+ }[];
14061
+ series?: {
14062
+ /** Format: uuid */
14063
+ serieId?: string;
14064
+ /** @example 6 */
14065
+ serieValue?: number;
14066
+ /** @example 6º ANO */
14067
+ serieLabel?: string;
14068
+ /** @enum {string} */
14069
+ level?: "fundamental" | "medio";
14070
+ }[];
14071
+ };
14072
+ };
14073
+ };
14074
+ };
14075
+ 401: components["responses"]["Unauthorized"];
14076
+ };
14077
+ };
14078
+ put?: never;
14079
+ post?: never;
14080
+ delete?: never;
14081
+ options?: never;
14082
+ head?: never;
14083
+ patch?: never;
14084
+ trace?: never;
14085
+ };
13565
14086
  "/users/me/push-tokens": {
13566
14087
  parameters: {
13567
14088
  query?: never;
@@ -15174,6 +15695,8 @@ interface components {
15174
15695
  certificateTemplate?: components["schemas"]["CertificateTemplate"];
15175
15696
  /** @description Course information related to the certificate (extracted from Quiz or CertificateTemplate) */
15176
15697
  course?: components["schemas"]["CourseSimplified"];
15698
+ /** @description Course module information related to the certificate (resolved from the quiz the student took). Null when the certificate came from a template course. */
15699
+ module?: components["schemas"]["ModuleSimplified"];
15177
15700
  };
15178
15701
  /** @description Simplified course information included in certificate responses */
15179
15702
  CourseSimplified: {
@@ -15193,6 +15716,26 @@ interface components {
15193
15716
  */
15194
15717
  description?: string | null;
15195
15718
  };
15719
+ /** @description Simplified course module information included in certificate responses */
15720
+ ModuleSimplified: {
15721
+ /**
15722
+ * Format: uuid
15723
+ * @description Course module ID
15724
+ */
15725
+ id?: string;
15726
+ /**
15727
+ * @description Course module title
15728
+ * @example Variables and Data Types
15729
+ */
15730
+ title?: string;
15731
+ /** @description Course module description */
15732
+ description?: string | null;
15733
+ /**
15734
+ * @description Course module workload in hours
15735
+ * @example 40
15736
+ */
15737
+ duration?: number | null;
15738
+ };
15196
15739
  /** @description Simplified quiz information included in course and module responses */
15197
15740
  QuizSimplified: {
15198
15741
  /**
@@ -22524,6 +23067,9 @@ type GetQuizzesParams = {
22524
23067
  page?: number;
22525
23068
  limit?: number;
22526
23069
  };
23070
+ type GetQuizzesWithContextParams = paths['/quiz/with-context']['get']['parameters']['query'];
23071
+ type GenerateQuizQuestionsBody = paths['/quiz/generate-questions']['post']['requestBody']['content']['application/json'];
23072
+ type BulkCreateQuizQuestionsBody = paths['/quiz-questions/bulk']['post']['requestBody']['content']['application/json'];
22527
23073
  type GetQuizQuestionsParams = paths['/quiz-questions']['get']['parameters']['query'];
22528
23074
  type GetQuizQuestionAnswersParams = paths['/quiz-question-answers']['get']['parameters']['query'];
22529
23075
  type GetQuizAttemptsParams = paths['/quiz-attempts']['get']['parameters']['query'];
@@ -22569,6 +23115,125 @@ declare function createQuizService(apiClient: AcademeApiClient): {
22569
23115
  query: GetQuizzesParams | undefined;
22570
23116
  };
22571
23117
  }, `${string}/${string}`>>;
23118
+ /**
23119
+ * List quizzes enriched with their course/module/category context.
23120
+ * Tailored for the backoffice listing.
23121
+ */
23122
+ getAllWithContext(params?: GetQuizzesWithContextParams): Promise<openapi_fetch.FetchResponse<{
23123
+ parameters: {
23124
+ query?: {
23125
+ title?: string;
23126
+ isActive?: boolean;
23127
+ createdBy?: string;
23128
+ search?: string;
23129
+ page?: number;
23130
+ limit?: number;
23131
+ };
23132
+ header?: never;
23133
+ path?: never;
23134
+ cookie?: never;
23135
+ };
23136
+ requestBody?: never;
23137
+ responses: {
23138
+ 200: {
23139
+ headers: {
23140
+ [name: string]: unknown;
23141
+ };
23142
+ content: {
23143
+ "application/json": {
23144
+ status?: string;
23145
+ data?: (components["schemas"]["Quiz"] & {
23146
+ context?: {
23147
+ course?: {
23148
+ id?: string;
23149
+ title?: string;
23150
+ } | null;
23151
+ module?: {
23152
+ id?: string;
23153
+ title?: string;
23154
+ } | null;
23155
+ category?: {
23156
+ id?: string;
23157
+ name?: string;
23158
+ color?: string | null;
23159
+ } | null;
23160
+ } | null;
23161
+ })[];
23162
+ meta?: components["schemas"]["PaginationMeta"];
23163
+ };
23164
+ };
23165
+ };
23166
+ 401: components["responses"]["Unauthorized"];
23167
+ 500: components["responses"]["ServerError"];
23168
+ };
23169
+ }, {
23170
+ params: {
23171
+ query: {
23172
+ title?: string;
23173
+ isActive?: boolean;
23174
+ createdBy?: string;
23175
+ search?: string;
23176
+ page?: number;
23177
+ limit?: number;
23178
+ } | undefined;
23179
+ };
23180
+ }, `${string}/${string}`>>;
23181
+ /**
23182
+ * Generate quiz questions from a base text using AI.
23183
+ * The OpenRouter key lives only on the server — this just calls the
23184
+ * authenticated backend endpoint.
23185
+ */
23186
+ generateQuestions(body: GenerateQuizQuestionsBody): Promise<openapi_fetch.FetchResponse<{
23187
+ parameters: {
23188
+ query?: never;
23189
+ header?: never;
23190
+ path?: never;
23191
+ cookie?: never;
23192
+ };
23193
+ requestBody: {
23194
+ content: {
23195
+ "application/json": {
23196
+ text: string;
23197
+ numQuestions: number;
23198
+ difficulty?: "facil" | "normal" | "dificil";
23199
+ existingQuestions?: string[];
23200
+ model?: string;
23201
+ };
23202
+ };
23203
+ };
23204
+ responses: {
23205
+ 200: {
23206
+ headers: {
23207
+ [name: string]: unknown;
23208
+ };
23209
+ content: {
23210
+ "application/json": {
23211
+ status?: string;
23212
+ data?: {
23213
+ question_text: string;
23214
+ question_type: "multiple_choice" | "true_false";
23215
+ points: number;
23216
+ options: {
23217
+ text: string;
23218
+ is_correct: boolean;
23219
+ }[];
23220
+ }[];
23221
+ };
23222
+ };
23223
+ };
23224
+ 400: components["responses"]["BadRequest"];
23225
+ 401: components["responses"]["Unauthorized"];
23226
+ 500: components["responses"]["ServerError"];
23227
+ };
23228
+ }, {
23229
+ body: {
23230
+ text: string;
23231
+ numQuestions: number;
23232
+ difficulty?: "facil" | "normal" | "dificil";
23233
+ existingQuestions?: string[];
23234
+ model?: string;
23235
+ };
23236
+ }, `${string}/${string}`>>;
22572
23237
  /**
22573
23238
  * Get quiz by ID
22574
23239
  */
@@ -22859,6 +23524,62 @@ declare function createQuizService(apiClient: AcademeApiClient): {
22859
23524
  points?: number;
22860
23525
  };
22861
23526
  }, `${string}/${string}`>>;
23527
+ /**
23528
+ * Bulk create quiz questions (with their answers) for a quiz.
23529
+ */
23530
+ bulkCreateQuestions(body: BulkCreateQuizQuestionsBody): Promise<openapi_fetch.FetchResponse<{
23531
+ parameters: {
23532
+ query?: never;
23533
+ header?: never;
23534
+ path?: never;
23535
+ cookie?: never;
23536
+ };
23537
+ requestBody: {
23538
+ content: {
23539
+ "application/json": {
23540
+ quizId: string;
23541
+ questions: {
23542
+ text: string;
23543
+ type: "multiple_choice" | "true_false" | "open";
23544
+ points?: number;
23545
+ options?: {
23546
+ text: string;
23547
+ is_correct: boolean;
23548
+ }[];
23549
+ }[];
23550
+ };
23551
+ };
23552
+ };
23553
+ responses: {
23554
+ 201: {
23555
+ headers: {
23556
+ [name: string]: unknown;
23557
+ };
23558
+ content: {
23559
+ "application/json": {
23560
+ status?: string;
23561
+ data?: components["schemas"]["QuizQuestion"][];
23562
+ };
23563
+ };
23564
+ };
23565
+ 400: components["responses"]["BadRequest"];
23566
+ 401: components["responses"]["Unauthorized"];
23567
+ 500: components["responses"]["ServerError"];
23568
+ };
23569
+ }, {
23570
+ body: {
23571
+ quizId: string;
23572
+ questions: {
23573
+ text: string;
23574
+ type: "multiple_choice" | "true_false" | "open";
23575
+ points?: number;
23576
+ options?: {
23577
+ text: string;
23578
+ is_correct: boolean;
23579
+ }[];
23580
+ }[];
23581
+ };
23582
+ }, `${string}/${string}`>>;
22862
23583
  /**
22863
23584
  * Update quiz question
22864
23585
  */
@@ -26645,6 +27366,11 @@ declare function createSubmissionService(apiClient: AcademeApiClient): {
26645
27366
  institutionId: string;
26646
27367
  groupId?: string;
26647
27368
  description?: string;
27369
+ items?: {
27370
+ fileId?: string | null;
27371
+ url?: string | null;
27372
+ index?: number;
27373
+ }[];
26648
27374
  };
26649
27375
  };
26650
27376
  };
@@ -26657,6 +27383,30 @@ declare function createSubmissionService(apiClient: AcademeApiClient): {
26657
27383
  "application/json": {
26658
27384
  status?: string;
26659
27385
  data?: components["schemas"]["Submission"];
27386
+ meta?: {
27387
+ advance?: {
27388
+ action?: "started" | "completed" | "finished";
27389
+ challengeId?: string;
27390
+ currentStep?: {
27391
+ id?: string;
27392
+ index?: number;
27393
+ name?: string;
27394
+ startedAt?: string | null;
27395
+ completedAt?: string | null;
27396
+ } | null;
27397
+ nextStep?: {
27398
+ id?: string;
27399
+ index?: number;
27400
+ name?: string;
27401
+ startedAt?: string | null;
27402
+ } | null;
27403
+ autoCompletedSteps?: {
27404
+ id?: string;
27405
+ index?: number;
27406
+ name?: string;
27407
+ }[];
27408
+ } | null;
27409
+ };
26660
27410
  };
26661
27411
  };
26662
27412
  };
@@ -27300,4 +28050,4 @@ declare enum NINA_ROLES {
27300
28050
  }
27301
28051
 
27302
28052
  export { AcademeAuthProvider, AcademeLoading, BACKOFFICE_ROLES, Button, CosmicDecor, CosmicStarsCanvas, DASHBOARD_ROLES, GLOBAL_ROLES, JourneyCrystalPin, JourneyStep, LogoA, MIKE_ROLES, NINA_ROLES, ProtectedApp, ProtectedComponent, ProtectedRouter, STREAMING_ROLES, Spinner, WIDGET_ROLES, academeApi_d as apiTypes, cn, createAcademeApiClient, index_d as types, useAcademeAuth, useProtectedAppColors };
27303
- export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeLoadingColors, AcademeLoadingProps, AcademeServices, AcademeUser, ButtonProps, ChallengeUserQuizAttempt, ChallengeUserQuizAttemptsResponse, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyChallengeView, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, JourneyStepView, JourneyView, KeycloakUser, LogoAProps, RequiredClientRoles, SecurityContextType, SecurityProviderProps };
28053
+ export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeLoadingColors, AcademeLoadingProps, AcademeLoadingTheme, AcademeServices, AcademeUser, ButtonProps, ChallengeUserQuizAttempt, ChallengeUserQuizAttemptsResponse, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyChallengeView, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, JourneyStepView, JourneyView, KeycloakUser, LogoAProps, RequiredClientRoles, SecurityContextType, SecurityProviderProps };