academe-kit 0.9.7 → 0.9.9

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
@@ -2109,6 +2109,12 @@ interface paths {
2109
2109
  templatesOnly?: boolean;
2110
2110
  /** @description Search by title */
2111
2111
  search?: string;
2112
+ /**
2113
+ * @description Comma-separated list of extra relations to load. Currently supported:
2114
+ * `steps` — embeds each challenge's `steps` (with their catalog `step`).
2115
+ * Opt-in to avoid penalizing list views that don't need them.
2116
+ */
2117
+ include?: "steps";
2112
2118
  /** @description Page number */
2113
2119
  page?: components["parameters"]["page"];
2114
2120
  /** @description Items per page */
@@ -2163,6 +2169,11 @@ interface paths {
2163
2169
  maxGroupMembers?: number;
2164
2170
  /** @default false */
2165
2171
  isInviteOnly?: boolean;
2172
+ /**
2173
+ * Format: uuid
2174
+ * @description Curso ao qual o desafio está associado (agrupa a jornada no dashboard)
2175
+ */
2176
+ courseId: string;
2166
2177
  /** Format: uuid */
2167
2178
  institutionId?: string | null;
2168
2179
  /** Format: uuid */
@@ -2305,6 +2316,8 @@ interface paths {
2305
2316
  maxGroupMembers?: number;
2306
2317
  isInviteOnly?: boolean;
2307
2318
  /** Format: uuid */
2319
+ courseId?: string;
2320
+ /** Format: uuid */
2308
2321
  serieId?: string;
2309
2322
  index?: number;
2310
2323
  /** @enum {string} */
@@ -2411,9 +2424,10 @@ interface paths {
2411
2424
  /**
2412
2425
  * Add a step to the challenge
2413
2426
  * @description Polymorphic validation:
2414
- * - When step.type=course, courseId is required
2415
2427
  * - When step.type=tutorial, tutorialVideoUrl is required
2416
- * - Other types must not have these specialized fields
2428
+ * - The course of a step is determined by the parent challenge's courseId.
2429
+ * Optionally, courseModuleId pinpoints a specific module within that course.
2430
+ * - tutorial fields are optional on any step type.
2417
2431
  */
2418
2432
  post: {
2419
2433
  parameters: {
@@ -2437,8 +2451,6 @@ interface paths {
2437
2451
  description?: string;
2438
2452
  index: number;
2439
2453
  /** Format: uuid */
2440
- courseId?: string;
2441
- /** Format: uuid */
2442
2454
  courseModuleId?: string;
2443
2455
  tutorialTitle?: string;
2444
2456
  tutorialDescription?: string;
@@ -2868,6 +2880,91 @@ interface paths {
2868
2880
  };
2869
2881
  trace?: never;
2870
2882
  };
2883
+ "/challenges/{id}/quiz-attempts": {
2884
+ parameters: {
2885
+ query?: never;
2886
+ header?: never;
2887
+ path?: never;
2888
+ cookie?: never;
2889
+ };
2890
+ /**
2891
+ * Get a user's quiz attempts for this challenge's course modules
2892
+ * @description Returns the quiz attempts of `userId` on every quiz attached to a course
2893
+ * module that is referenced by one of this challenge's steps. Optionally
2894
+ * includes the issued certificate per attempt.
2895
+ *
2896
+ * Each entry corresponds to a `challenges_steps` row that has a non-null
2897
+ * `course_module_id` whose `course_module.quiz_id` is also non-null.
2898
+ * `attempt` is `null` when the user has not yet attempted that quiz.
2899
+ */
2900
+ get: {
2901
+ parameters: {
2902
+ query?: {
2903
+ /** @description Defaults to the authenticated user when omitted. */
2904
+ userId?: string;
2905
+ };
2906
+ header?: never;
2907
+ path: {
2908
+ /** @description Resource ID */
2909
+ id: components["parameters"]["id"];
2910
+ };
2911
+ cookie?: never;
2912
+ };
2913
+ requestBody?: never;
2914
+ responses: {
2915
+ /** @description List of quiz attempts (one per quiz-bearing challenge step) */
2916
+ 200: {
2917
+ headers: {
2918
+ [name: string]: unknown;
2919
+ };
2920
+ content: {
2921
+ "application/json": {
2922
+ /** @example success */
2923
+ status?: string;
2924
+ data?: {
2925
+ /** Format: uuid */
2926
+ challengeStepId?: string;
2927
+ challengeStepName?: string;
2928
+ challengeStepIndex?: number;
2929
+ /** Format: uuid */
2930
+ courseModuleId?: string;
2931
+ courseModuleTitle?: string;
2932
+ /** Format: uuid */
2933
+ quizId?: string;
2934
+ quizTitle?: string;
2935
+ attempt?: {
2936
+ /** Format: uuid */
2937
+ id?: string;
2938
+ score?: number;
2939
+ passed?: boolean;
2940
+ /** Format: date-time */
2941
+ startedAt?: string;
2942
+ /** Format: date-time */
2943
+ completedAt?: string | null;
2944
+ } | null;
2945
+ certificate?: {
2946
+ /** Format: uuid */
2947
+ id?: string;
2948
+ certificateNumber?: string;
2949
+ url?: string | null;
2950
+ } | null;
2951
+ }[];
2952
+ };
2953
+ };
2954
+ };
2955
+ 400: components["responses"]["BadRequest"];
2956
+ 401: components["responses"]["Unauthorized"];
2957
+ 404: components["responses"]["NotFound"];
2958
+ };
2959
+ };
2960
+ put?: never;
2961
+ post?: never;
2962
+ delete?: never;
2963
+ options?: never;
2964
+ head?: never;
2965
+ patch?: never;
2966
+ trace?: never;
2967
+ };
2871
2968
  "/classrooms": {
2872
2969
  parameters: {
2873
2970
  query?: never;
@@ -9566,6 +9663,8 @@ interface paths {
9566
9663
  page?: number;
9567
9664
  /** @description Items per page */
9568
9665
  limit?: number;
9666
+ /** @description When true, returns questions in random order with shuffled answer alternatives. Each request reshuffles independently. */
9667
+ randomize?: boolean;
9569
9668
  };
9570
9669
  header?: never;
9571
9670
  path?: never;
@@ -10619,6 +10718,76 @@ interface paths {
10619
10718
  patch?: never;
10620
10719
  trace?: never;
10621
10720
  };
10721
+ "/reports/encourage-dashboard/{id}": {
10722
+ parameters: {
10723
+ query?: never;
10724
+ header?: never;
10725
+ path?: never;
10726
+ cookie?: never;
10727
+ };
10728
+ /**
10729
+ * Payload completo da nova tela /new-dashboard
10730
+ * @description Retorna o dashboard agregado por instituição: overview, KPIs,
10731
+ * licenças (apenas tipo aluno), jornada (cursos deduplicados),
10732
+ * submissões, desempenho por turma, top 10 alunos (por certificados,
10733
+ * desempate por nota) e top 10 professores (por avaliações).
10734
+ */
10735
+ get: {
10736
+ parameters: {
10737
+ query?: never;
10738
+ header?: never;
10739
+ path: {
10740
+ /** @description ID da instituição */
10741
+ id: string;
10742
+ };
10743
+ cookie?: never;
10744
+ };
10745
+ requestBody?: never;
10746
+ responses: {
10747
+ /** @description Payload completo do encourage dashboard */
10748
+ 200: {
10749
+ headers: {
10750
+ [name: string]: unknown;
10751
+ };
10752
+ content: {
10753
+ "application/json": {
10754
+ /** @example success */
10755
+ status?: string;
10756
+ data?: components["schemas"]["EncourageDashboardResponse"];
10757
+ };
10758
+ };
10759
+ };
10760
+ /** @description institutionId inválido */
10761
+ 400: {
10762
+ headers: {
10763
+ [name: string]: unknown;
10764
+ };
10765
+ content?: never;
10766
+ };
10767
+ /** @description Não autenticado */
10768
+ 401: {
10769
+ headers: {
10770
+ [name: string]: unknown;
10771
+ };
10772
+ content?: never;
10773
+ };
10774
+ /** @description Erro interno */
10775
+ 500: {
10776
+ headers: {
10777
+ [name: string]: unknown;
10778
+ };
10779
+ content?: never;
10780
+ };
10781
+ };
10782
+ };
10783
+ put?: never;
10784
+ post?: never;
10785
+ delete?: never;
10786
+ options?: never;
10787
+ head?: never;
10788
+ patch?: never;
10789
+ trace?: never;
10790
+ };
10622
10791
  "/roles": {
10623
10792
  parameters: {
10624
10793
  query?: never;
@@ -11625,7 +11794,22 @@ interface paths {
11625
11794
  /** @example success */
11626
11795
  status?: string;
11627
11796
  data?: components["schemas"]["Submission"][];
11628
- meta?: components["schemas"]["PaginationMeta"];
11797
+ meta?: components["schemas"]["PaginationMeta"] & {
11798
+ /**
11799
+ * @description Contagem por status, ignorando o filtro `status`. Útil para
11800
+ * alimentar abas/pills sem requisições adicionais.
11801
+ */
11802
+ statusCounts?: {
11803
+ /** @example 12 */
11804
+ submitted?: number;
11805
+ /** @example 4 */
11806
+ ai_evaluated?: number;
11807
+ /** @example 30 */
11808
+ approved?: number;
11809
+ /** @example 2 */
11810
+ rejected?: number;
11811
+ };
11812
+ };
11629
11813
  };
11630
11814
  };
11631
11815
  };
@@ -12287,6 +12471,208 @@ interface paths {
12287
12471
  patch?: never;
12288
12472
  trace?: never;
12289
12473
  };
12474
+ "/user-challenge-progress/journey": {
12475
+ parameters: {
12476
+ query?: never;
12477
+ header?: never;
12478
+ path?: never;
12479
+ cookie?: never;
12480
+ };
12481
+ /**
12482
+ * Jornada completa pré-computada do aluno autenticado
12483
+ * @description Retorna todos os desafios da série com suas etapas e o status de progresso do aluno
12484
+ * já computados pelo backend. Substitui as ~25 chamadas HTTP paralelas que o frontend
12485
+ * fazia anteriormente para montar a tela de jornada.
12486
+ *
12487
+ * **Regra de prioridade:** para cada `index` de desafio dentro da série, o backend
12488
+ * prefere o challenge específico da instituição do aluno sobre o template global
12489
+ * (`institution_id IS NULL`). Isso permite que escolas customizem desafios pontuais
12490
+ * sem recriar toda a jornada.
12491
+ *
12492
+ * **Resolução da série:** se `serieId` não for informado, o backend resolve
12493
+ * automaticamente a partir da turma (`institutionClassroom`) do aluno. Se o aluno
12494
+ * não estiver em nenhuma turma e `serieId` também não for passado, retorna
12495
+ * `challenges: []` com `serieId: null`.
12496
+ *
12497
+ * **Status por etapa:** `done` = completedAt preenchido; `current` = primeira etapa
12498
+ * não concluída (apenas uma por vez); `locked` = todas as demais.
12499
+ *
12500
+ * **Progresso:** para etapas `type=course` no status `current`, o campo `progress`
12501
+ * reflete o percentual de lições concluídas no módulo. Para `done` é sempre 100,
12502
+ * para `locked` é sempre 0.
12503
+ */
12504
+ get: {
12505
+ parameters: {
12506
+ query?: {
12507
+ /**
12508
+ * @description ID da série a filtrar. Opcional — se omitido, o backend resolve pela turma do aluno.
12509
+ * Útil para pré-visualização administrativa ou quando o aluno pertence a múltiplas séries.
12510
+ */
12511
+ serieId?: string;
12512
+ };
12513
+ header?: never;
12514
+ path?: never;
12515
+ cookie?: never;
12516
+ };
12517
+ requestBody?: never;
12518
+ responses: {
12519
+ /** @description Jornada pré-computada com desafios e etapas */
12520
+ 200: {
12521
+ headers: {
12522
+ [name: string]: unknown;
12523
+ };
12524
+ content: {
12525
+ /**
12526
+ * @example {
12527
+ * "status": "success",
12528
+ * "data": {
12529
+ * "serieId": "a1b2c3d4-0000-0000-0000-000000000001",
12530
+ * "serieLabel": "6º ANO",
12531
+ * "challenges": [
12532
+ * {
12533
+ * "id": "a1b2c3d4-0000-0000-0000-000000000002",
12534
+ * "title": "Desafio 1 — Energia Limpa",
12535
+ * "index": 0,
12536
+ * "courseId": "a1b2c3d4-0000-0000-0000-000000000003",
12537
+ * "isUpcoming": false,
12538
+ * "steps": [
12539
+ * {
12540
+ * "id": "a1b2c3d4-0000-0000-0000-000000000010",
12541
+ * "name": "Inicie o desafio",
12542
+ * "index": 0,
12543
+ * "type": "challenge",
12544
+ * "color": "#1AC84A",
12545
+ * "icon": "LuStar",
12546
+ * "status": "done",
12547
+ * "progress": 100,
12548
+ * "courseModuleId": null,
12549
+ * "courseModuleName": null
12550
+ * },
12551
+ * {
12552
+ * "id": "a1b2c3d4-0000-0000-0000-000000000011",
12553
+ * "name": "Módulo de IA",
12554
+ * "index": 1,
12555
+ * "type": "course",
12556
+ * "color": "#8030D8",
12557
+ * "icon": "LuCirclePlay",
12558
+ * "status": "current",
12559
+ * "progress": 67,
12560
+ * "courseModuleId": "a1b2c3d4-0000-0000-0000-000000000020",
12561
+ * "courseModuleName": "Introdução a IA"
12562
+ * }
12563
+ * ]
12564
+ * }
12565
+ * ]
12566
+ * }
12567
+ * }
12568
+ */
12569
+ "application/json": {
12570
+ /** @example success */
12571
+ status?: string;
12572
+ data?: components["schemas"]["JourneyView"];
12573
+ };
12574
+ };
12575
+ };
12576
+ /** @description serieId inválido (não é um UUID) */
12577
+ 400: {
12578
+ headers: {
12579
+ [name: string]: unknown;
12580
+ };
12581
+ content: {
12582
+ "application/json": components["schemas"]["Error"];
12583
+ };
12584
+ };
12585
+ 401: components["responses"]["Unauthorized"];
12586
+ };
12587
+ };
12588
+ put?: never;
12589
+ post?: never;
12590
+ delete?: never;
12591
+ options?: never;
12592
+ head?: never;
12593
+ patch?: never;
12594
+ trace?: never;
12595
+ };
12596
+ "/user-challenge-progress/challenges/{id}/advance": {
12597
+ parameters: {
12598
+ query?: never;
12599
+ header?: never;
12600
+ path?: never;
12601
+ cookie?: never;
12602
+ };
12603
+ get?: never;
12604
+ put?: never;
12605
+ /**
12606
+ * Advance one tick in the user's journey on a challenge
12607
+ * @description Unified journey advancement, agnostic of step type. Each call performs ONE action:
12608
+ *
12609
+ * 1. Resolves the current step = first active step (by index) not yet completed by the user.
12610
+ * 2. If no progress row exists for that step → creates one (action='started').
12611
+ * 3. If progress row exists with completed_at IS NULL → sets completed_at (action='completed').
12612
+ * 4. If all steps are completed → no-op (action='finished').
12613
+ *
12614
+ * Web and mobile clients must use this endpoint regardless of the step type
12615
+ * (challenge, course, tutorial, publication, evaluation, certificate).
12616
+ */
12617
+ post: {
12618
+ parameters: {
12619
+ query?: never;
12620
+ header?: never;
12621
+ path: {
12622
+ /** @description Resource ID */
12623
+ id: components["parameters"]["id"];
12624
+ };
12625
+ cookie?: never;
12626
+ };
12627
+ requestBody?: never;
12628
+ responses: {
12629
+ /** @description Tick result */
12630
+ 200: {
12631
+ headers: {
12632
+ [name: string]: unknown;
12633
+ };
12634
+ content: {
12635
+ "application/json": {
12636
+ /** @example success */
12637
+ status?: string;
12638
+ data?: {
12639
+ /** @enum {string} */
12640
+ action?: "started" | "completed" | "finished";
12641
+ /** Format: uuid */
12642
+ challengeId?: string;
12643
+ currentStep?: {
12644
+ /** Format: uuid */
12645
+ id?: string;
12646
+ index?: number;
12647
+ name?: string;
12648
+ /** Format: date-time */
12649
+ startedAt?: string | null;
12650
+ /** Format: date-time */
12651
+ completedAt?: string | null;
12652
+ } | null;
12653
+ /** @description Next step in the journey. When action='completed', this step is also auto-started on the same call (startedAt populated). */
12654
+ nextStep?: {
12655
+ /** Format: uuid */
12656
+ id?: string;
12657
+ index?: number;
12658
+ name?: string;
12659
+ /** Format: date-time */
12660
+ startedAt?: string | null;
12661
+ } | null;
12662
+ };
12663
+ };
12664
+ };
12665
+ };
12666
+ 401: components["responses"]["Unauthorized"];
12667
+ 404: components["responses"]["NotFound"];
12668
+ };
12669
+ };
12670
+ delete?: never;
12671
+ options?: never;
12672
+ head?: never;
12673
+ patch?: never;
12674
+ trace?: never;
12675
+ };
12290
12676
  "/user-challenge-progress/steps/{stepId}/start": {
12291
12677
  parameters: {
12292
12678
  query?: never;
@@ -12297,9 +12683,12 @@ interface paths {
12297
12683
  get?: never;
12298
12684
  put?: never;
12299
12685
  /**
12300
- * Start a challenge step (idempotent)
12301
- * @description Creates a user_challenge_progress row. If one already exists for this user/step,
12686
+ * [Internal/Admin] Force-start a specific challenge step (idempotent)
12687
+ * @description Creates a user_challenge_progress row for the given step. If one already exists,
12302
12688
  * returns the existing row (idempotent).
12689
+ *
12690
+ * Client apps (web/mobile) should use POST /user-challenge-progress/challenges/{id}/advance
12691
+ * instead. This endpoint is retained for internal/admin tooling that needs to force a state.
12303
12692
  */
12304
12693
  post: {
12305
12694
  parameters: {
@@ -12346,8 +12735,12 @@ interface paths {
12346
12735
  get?: never;
12347
12736
  put?: never;
12348
12737
  /**
12349
- * Mark step as completed
12350
- * @description Sets completed_at on the user's progress row. Idempotent (no-op if already completed)
12738
+ * [Internal/Admin] Force-complete a specific challenge step
12739
+ * @description Sets completed_at on the user's progress row for the given step. Idempotent
12740
+ * (no-op if already completed).
12741
+ *
12742
+ * Client apps (web/mobile) should use POST /user-challenge-progress/challenges/{id}/advance
12743
+ * instead. This endpoint is retained for internal/admin tooling that needs to force a state.
12351
12744
  */
12352
12745
  post: {
12353
12746
  parameters: {
@@ -14364,6 +14757,9 @@ interface components {
14364
14757
  createdAt: string;
14365
14758
  /** Format: date-time */
14366
14759
  updatedAt: string;
14760
+ organization?: components["schemas"]["Organization"] | null;
14761
+ address?: components["schemas"]["Address"] | null;
14762
+ institutionReward?: Record<string, never> | null;
14367
14763
  };
14368
14764
  Organization: {
14369
14765
  /** Format: uuid */
@@ -14909,6 +15305,11 @@ interface components {
14909
15305
  maxGroupMembers?: number;
14910
15306
  /** @example false */
14911
15307
  isInviteOnly?: boolean;
15308
+ /**
15309
+ * Format: uuid
15310
+ * @description Curso ao qual o desafio está associado (agrupa a jornada no dashboard)
15311
+ */
15312
+ courseId?: string;
14912
15313
  /**
14913
15314
  * Format: uuid
14914
15315
  * @description Null para template global
@@ -14944,6 +15345,8 @@ interface components {
14944
15345
  createdAt?: string;
14945
15346
  /** Format: date-time */
14946
15347
  updatedAt?: string;
15348
+ /** @description Populado quando `include=steps` é informado no GET /challenges, ou via GET /challenges/{id} */
15349
+ steps?: components["schemas"]["ChallengeStep"][];
14947
15350
  };
14948
15351
  ChallengeMedia: {
14949
15352
  /** Format: uuid */
@@ -14972,10 +15375,8 @@ interface components {
14972
15375
  index?: number;
14973
15376
  /**
14974
15377
  * Format: uuid
14975
- * @description Obrigatório quando step type=course
15378
+ * @description Opcional. Quando step type=course, aponta para o módulo específico do curso do challenge.
14976
15379
  */
14977
- courseId?: string | null;
14978
- /** Format: uuid */
14979
15380
  courseModuleId?: string | null;
14980
15381
  tutorialTitle?: string | null;
14981
15382
  tutorialDescription?: string | null;
@@ -14986,6 +15387,8 @@ interface components {
14986
15387
  createdAt?: string;
14987
15388
  /** Format: date-time */
14988
15389
  updatedAt?: string;
15390
+ /** @description Catálogo do step (cor, ícone, tipo). Populado junto com o relation `steps.step`. */
15391
+ step?: components["schemas"]["Step"];
14989
15392
  };
14990
15393
  /** @description Item do checklist descritivo de entrega */
14991
15394
  ChallengeDeliveryStep: {
@@ -15057,6 +15460,99 @@ interface components {
15057
15460
  /** Format: date-time */
15058
15461
  updatedAt?: string;
15059
15462
  };
15463
+ /** @description Etapa de um desafio com status computado pelo backend */
15464
+ JourneyStepView: {
15465
+ /**
15466
+ * Format: uuid
15467
+ * @description ID do challenge_step
15468
+ */
15469
+ id: string;
15470
+ /** @example Módulo de IA */
15471
+ name: string;
15472
+ /**
15473
+ * @description Ordem da etapa dentro do desafio
15474
+ * @example 1
15475
+ */
15476
+ index: number;
15477
+ /**
15478
+ * @description Tipo da etapa (do catálogo de steps)
15479
+ * @example course
15480
+ * @enum {string}
15481
+ */
15482
+ type: "challenge" | "course" | "tutorial" | "publication" | "evaluation" | "certificate";
15483
+ /**
15484
+ * @description Cor hex do step catalog
15485
+ * @example #8030D8
15486
+ */
15487
+ color: string;
15488
+ /**
15489
+ * @description Nome do ícone Lucide do step catalog
15490
+ * @example LuCirclePlay
15491
+ */
15492
+ icon: string;
15493
+ /**
15494
+ * @description Status computado pelo backend: done=concluído, current=etapa ativa, locked=ainda bloqueado
15495
+ * @example current
15496
+ * @enum {string}
15497
+ */
15498
+ status: "done" | "current" | "locked";
15499
+ /**
15500
+ * @description Percentual de progresso (0-100). Para done=100, para locked=0, para current=% do curso ou 0
15501
+ * @example 67
15502
+ */
15503
+ progress: number;
15504
+ /**
15505
+ * Format: uuid
15506
+ * @description ID do módulo do curso referenciado por esta etapa (apenas quando type=course)
15507
+ */
15508
+ courseModuleId?: string | null;
15509
+ /**
15510
+ * @description Título do módulo do curso (apenas quando courseModuleId não é null)
15511
+ * @example Introdução a IA
15512
+ */
15513
+ courseModuleName?: string | null;
15514
+ };
15515
+ /** @description Desafio da jornada com suas etapas e status computados */
15516
+ JourneyChallengeView: {
15517
+ /**
15518
+ * Format: uuid
15519
+ * @description ID do challenge
15520
+ */
15521
+ id: string;
15522
+ /** @example Desafio 1 — Energia Limpa */
15523
+ title: string;
15524
+ /**
15525
+ * @description Ordem do desafio na série
15526
+ * @example 0
15527
+ */
15528
+ index: number;
15529
+ /**
15530
+ * Format: uuid
15531
+ * @description Curso ao qual o desafio está associado
15532
+ */
15533
+ courseId: string;
15534
+ /**
15535
+ * @description True quando o desafio ainda não está disponível para o aluno (challenge seguinte ao ativo com steps pendentes)
15536
+ * @example false
15537
+ */
15538
+ isUpcoming: boolean;
15539
+ steps: components["schemas"]["JourneyStepView"][];
15540
+ };
15541
+ /** @description Resposta completa do endpoint GET /user-challenge-progress/journey — dados pré-computados para renderização direta da tela de jornada */
15542
+ JourneyView: {
15543
+ /** @description Desafios da jornada ordenados por index, com prioridade escola > template aplicada */
15544
+ challenges: components["schemas"]["JourneyChallengeView"][];
15545
+ /**
15546
+ * Format: uuid
15547
+ * @description ID da série resolvida (da turma do aluno, ou do query param serieId)
15548
+ */
15549
+ serieId: string | null;
15550
+ /**
15551
+ * @description Rótulo legível da série para exibição na UI
15552
+ * @example 6º ANO
15553
+ */
15554
+ serieLabel: string | null;
15555
+ };
15060
15556
  /** @description Aggregated progress of a user on a course or module, derived from users_course_log completion events */
15061
15557
  UsersCourseLogProgress: {
15062
15558
  /**
@@ -15995,6 +16491,121 @@ interface components {
15995
16491
  totalStudents?: number;
15996
16492
  year?: number;
15997
16493
  };
16494
+ EncourageActivePeriod: {
16495
+ /** Format: uuid */
16496
+ id?: string;
16497
+ /** Format: date-time */
16498
+ start?: string;
16499
+ /** Format: date-time */
16500
+ end?: string;
16501
+ /** @example Bimestre */
16502
+ label?: string;
16503
+ /** @example 4 */
16504
+ periodsPerYear?: number;
16505
+ };
16506
+ EncourageOverview: {
16507
+ userFirstName?: string;
16508
+ institutionName?: string;
16509
+ activePeriod?: components["schemas"]["EncourageActivePeriod"];
16510
+ /** Format: float */
16511
+ globalProgressPct?: number;
16512
+ };
16513
+ EncourageKpis: {
16514
+ totalStudents?: number;
16515
+ /** Format: float */
16516
+ totalStudentsDeltaPct?: number;
16517
+ completedProjects?: number;
16518
+ /** Format: float */
16519
+ completedProjectsDeltaPct?: number;
16520
+ /** Format: float */
16521
+ engagementRatePct?: number;
16522
+ /** Format: float */
16523
+ engagementRateDeltaPct?: number;
16524
+ neverLoggedIn?: number;
16525
+ neverLoggedInDelta?: number;
16526
+ };
16527
+ /** @description Licenças do tipo aluno (seats.group_id → group.type = 'student') */
16528
+ EncourageLicenses: {
16529
+ used?: number;
16530
+ total?: number;
16531
+ /** Format: float */
16532
+ pct?: number;
16533
+ available?: number;
16534
+ };
16535
+ EncourageJourneyCourse: {
16536
+ /** Format: uuid */
16537
+ courseId?: string;
16538
+ title?: string;
16539
+ /** Format: date-time */
16540
+ dueDate?: string;
16541
+ /** Format: float */
16542
+ progressPct?: number;
16543
+ challengesCount?: number;
16544
+ color?: string;
16545
+ };
16546
+ EncourageJourney: {
16547
+ totalCourses?: number;
16548
+ /** Format: float */
16549
+ averageProgressPct?: number;
16550
+ /** @enum {string} */
16551
+ periodKind?: "semester" | "trimester" | "bimester";
16552
+ courses?: components["schemas"]["EncourageJourneyCourse"][];
16553
+ };
16554
+ EncourageSubmissions: {
16555
+ total?: number;
16556
+ evaluated?: number;
16557
+ awaitingTeacher?: number;
16558
+ awaitingAi?: number;
16559
+ };
16560
+ EncourageClassPerformance: {
16561
+ /** Format: uuid */
16562
+ classroomId?: string;
16563
+ /** @example 2º A — Médio */
16564
+ name?: string;
16565
+ /** @example Manhã */
16566
+ meta?: string;
16567
+ /** @description Total de alunos cadastrados na turma */
16568
+ studentsCount?: number;
16569
+ /** @description Alunos que submeteram pelo menos 1 challenge do período ativo */
16570
+ submittedCount?: number;
16571
+ /** Format: float */
16572
+ progressPct?: number;
16573
+ /** @enum {string} */
16574
+ level?: "high" | "medium" | "low";
16575
+ };
16576
+ EncourageTopStudent: {
16577
+ /** Format: uuid */
16578
+ userId?: string;
16579
+ rank?: number;
16580
+ name?: string;
16581
+ initials?: string;
16582
+ avatarColor?: string;
16583
+ certificates?: number;
16584
+ /** Format: float */
16585
+ averageScore?: number;
16586
+ };
16587
+ EncourageTopTeacher: {
16588
+ /** Format: uuid */
16589
+ userId?: string;
16590
+ rank?: number;
16591
+ name?: string;
16592
+ initials?: string;
16593
+ avatarColor?: string;
16594
+ evaluationsCount?: number;
16595
+ averageEvaluationSeconds?: number;
16596
+ /** Format: float */
16597
+ averageScore?: number;
16598
+ };
16599
+ EncourageDashboardResponse: {
16600
+ overview?: components["schemas"]["EncourageOverview"];
16601
+ kpis?: components["schemas"]["EncourageKpis"];
16602
+ licenses?: components["schemas"]["EncourageLicenses"];
16603
+ journey?: components["schemas"]["EncourageJourney"];
16604
+ submissions?: components["schemas"]["EncourageSubmissions"];
16605
+ classes?: components["schemas"]["EncourageClassPerformance"][];
16606
+ topStudents?: components["schemas"]["EncourageTopStudent"][];
16607
+ topTeachers?: components["schemas"]["EncourageTopTeacher"][];
16608
+ };
15998
16609
  UserCreationRequest: {
15999
16610
  /**
16000
16611
  * Format: uuid
@@ -19585,6 +20196,62 @@ declare function createReportService(apiClient: AcademeApiClient): {
19585
20196
  query: GetTopStudentsParams;
19586
20197
  };
19587
20198
  }, `${string}/${string}`>>;
20199
+ /**
20200
+ * Get encourage dashboard for an institution
20201
+ * Retorna o payload agregado da tela /new-dashboard:
20202
+ * overview, KPIs, licenças (alunos), jornada (cursos), submissões,
20203
+ * desempenho por turma, top alunos e top professores.
20204
+ *
20205
+ * @param id UUID da instituição.
20206
+ */
20207
+ getEncourageDashboardByInstitution(id: string): Promise<openapi_fetch.FetchResponse<{
20208
+ parameters: {
20209
+ query?: never;
20210
+ header?: never;
20211
+ path: {
20212
+ id: string;
20213
+ };
20214
+ cookie?: never;
20215
+ };
20216
+ requestBody?: never;
20217
+ responses: {
20218
+ 200: {
20219
+ headers: {
20220
+ [name: string]: unknown;
20221
+ };
20222
+ content: {
20223
+ "application/json": {
20224
+ status?: string;
20225
+ data?: components["schemas"]["EncourageDashboardResponse"];
20226
+ };
20227
+ };
20228
+ };
20229
+ 400: {
20230
+ headers: {
20231
+ [name: string]: unknown;
20232
+ };
20233
+ content?: never;
20234
+ };
20235
+ 401: {
20236
+ headers: {
20237
+ [name: string]: unknown;
20238
+ };
20239
+ content?: never;
20240
+ };
20241
+ 500: {
20242
+ headers: {
20243
+ [name: string]: unknown;
20244
+ };
20245
+ content?: never;
20246
+ };
20247
+ };
20248
+ }, {
20249
+ params: {
20250
+ path: {
20251
+ id: string;
20252
+ };
20253
+ };
20254
+ }, `${string}/${string}`>>;
19588
20255
  };
19589
20256
  type ReportService = ReturnType<typeof createReportService>;
19590
20257
 
@@ -21720,6 +22387,7 @@ declare function createQuizService(apiClient: AcademeApiClient): {
21720
22387
  search?: string;
21721
22388
  page?: number;
21722
22389
  limit?: number;
22390
+ randomize?: boolean;
21723
22391
  };
21724
22392
  header?: never;
21725
22393
  path?: never;
@@ -21750,6 +22418,7 @@ declare function createQuizService(apiClient: AcademeApiClient): {
21750
22418
  search?: string;
21751
22419
  page?: number;
21752
22420
  limit?: number;
22421
+ randomize?: boolean;
21753
22422
  } | undefined;
21754
22423
  };
21755
22424
  }, `${string}/${string}`>>;
@@ -24500,7 +25169,6 @@ interface UpdateChallengeStepBody {
24500
25169
  name?: string;
24501
25170
  description?: string;
24502
25171
  index?: number;
24503
- courseId?: string;
24504
25172
  courseModuleId?: string;
24505
25173
  tutorialTitle?: string;
24506
25174
  tutorialDescription?: string;
@@ -24520,6 +25188,35 @@ interface UpdateEvaluationCriterionBody {
24520
25188
  description?: string;
24521
25189
  index?: number;
24522
25190
  }
25191
+ interface ChallengeUserQuizAttempt {
25192
+ challengeStepId: string;
25193
+ challengeStepName: string;
25194
+ challengeStepIndex: number;
25195
+ courseModuleId: string;
25196
+ courseModuleTitle: string;
25197
+ quizId: string;
25198
+ quizTitle: string;
25199
+ attempt: {
25200
+ id: string;
25201
+ score: number;
25202
+ passed: boolean;
25203
+ startedAt: string;
25204
+ completedAt: string | null;
25205
+ } | null;
25206
+ certificate: {
25207
+ id: string;
25208
+ certificateNumber: string;
25209
+ url: string | null;
25210
+ } | null;
25211
+ }
25212
+ interface ChallengeUserQuizAttemptsResponse {
25213
+ data?: {
25214
+ status?: string;
25215
+ data?: ChallengeUserQuizAttempt[];
25216
+ };
25217
+ error?: unknown;
25218
+ response: Response;
25219
+ }
24523
25220
  declare function createChallengeService(apiClient: AcademeApiClient): {
24524
25221
  /**
24525
25222
  * List challenges with filters and pagination
@@ -24532,6 +25229,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24532
25229
  isActive?: boolean;
24533
25230
  templatesOnly?: boolean;
24534
25231
  search?: string;
25232
+ include?: "steps";
24535
25233
  page?: components["parameters"]["page"];
24536
25234
  limit?: components["parameters"]["limit"];
24537
25235
  };
@@ -24564,6 +25262,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24564
25262
  isActive?: boolean;
24565
25263
  templatesOnly?: boolean;
24566
25264
  search?: string;
25265
+ include?: "steps";
24567
25266
  page?: components["parameters"]["page"];
24568
25267
  limit?: components["parameters"]["limit"];
24569
25268
  } | undefined;
@@ -24628,6 +25327,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24628
25327
  isGroup?: boolean;
24629
25328
  maxGroupMembers?: number;
24630
25329
  isInviteOnly?: boolean;
25330
+ courseId: string;
24631
25331
  institutionId?: string | null;
24632
25332
  serieId?: string;
24633
25333
  index?: number;
@@ -24666,6 +25366,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24666
25366
  isGroup?: boolean;
24667
25367
  maxGroupMembers?: number;
24668
25368
  isInviteOnly?: boolean;
25369
+ courseId: string;
24669
25370
  institutionId?: string | null;
24670
25371
  serieId?: string;
24671
25372
  index?: number;
@@ -24699,6 +25400,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24699
25400
  isGroup?: boolean;
24700
25401
  maxGroupMembers?: number;
24701
25402
  isInviteOnly?: boolean;
25403
+ courseId?: string;
24702
25404
  serieId?: string;
24703
25405
  index?: number;
24704
25406
  submissionType?: "images" | "videos" | "audio" | "files" | "links";
@@ -24739,6 +25441,7 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24739
25441
  isGroup?: boolean;
24740
25442
  maxGroupMembers?: number;
24741
25443
  isInviteOnly?: boolean;
25444
+ courseId?: string;
24742
25445
  serieId?: string;
24743
25446
  index?: number;
24744
25447
  submissionType?: "images" | "videos" | "audio" | "files" | "links";
@@ -24825,6 +25528,12 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24825
25528
  title?: string;
24826
25529
  };
24827
25530
  }, `${string}/${string}`>>;
25531
+ /**
25532
+ * Get a user's quiz attempts for the quizzes attached to this challenge's
25533
+ * course modules (one entry per step with course_module.quiz_id).
25534
+ * Defaults to the authenticated user when userId is omitted.
25535
+ */
25536
+ getUserQuizAttempts(challengeId: string, userId?: string): Promise<ChallengeUserQuizAttemptsResponse>;
24828
25537
  /**
24829
25538
  * Add a step to the challenge
24830
25539
  */
@@ -24844,7 +25553,6 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24844
25553
  name: string;
24845
25554
  description?: string;
24846
25555
  index: number;
24847
- courseId?: string;
24848
25556
  courseModuleId?: string;
24849
25557
  tutorialTitle?: string;
24850
25558
  tutorialDescription?: string;
@@ -24879,7 +25587,6 @@ declare function createChallengeService(apiClient: AcademeApiClient): {
24879
25587
  name: string;
24880
25588
  description?: string;
24881
25589
  index: number;
24882
- courseId?: string;
24883
25590
  courseModuleId?: string;
24884
25591
  tutorialTitle?: string;
24885
25592
  tutorialDescription?: string;
@@ -25487,7 +26194,14 @@ declare function createSubmissionService(apiClient: AcademeApiClient): {
25487
26194
  "application/json": {
25488
26195
  status?: string;
25489
26196
  data?: components["schemas"]["Submission"][];
25490
- meta?: components["schemas"]["PaginationMeta"];
26197
+ meta?: components["schemas"]["PaginationMeta"] & {
26198
+ statusCounts?: {
26199
+ submitted?: number;
26200
+ ai_evaluated?: number;
26201
+ approved?: number;
26202
+ rejected?: number;
26203
+ };
26204
+ };
25491
26205
  };
25492
26206
  };
25493
26207
  };
@@ -25917,4 +26631,4 @@ declare enum NINA_ROLES {
25917
26631
  }
25918
26632
 
25919
26633
  export { AcademeAuthProvider, BACKOFFICE_ROLES, Button, CosmicDecor, CosmicStarsCanvas, DASHBOARD_ROLES, GLOBAL_ROLES, JourneyCrystalPin, JourneyStep, MIKE_ROLES, NINA_ROLES, ProtectedApp, ProtectedComponent, ProtectedRouter, STREAMING_ROLES, Spinner, WIDGET_ROLES, academeApi_d as apiTypes, cn, createAcademeApiClient, index_d as types, useAcademeAuth, useProtectedAppColors };
25920
- export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeServices, AcademeUser, ButtonProps, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, KeycloakUser, RequiredClientRoles, SecurityContextType, SecurityProviderProps };
26634
+ export type { AcademeApiClient, AcademeKeycloakContextProps, AcademeServices, AcademeUser, ButtonProps, ChallengeUserQuizAttempt, ChallengeUserQuizAttemptsResponse, CosmicDecorProps, CosmicDecorVariant, CosmicPlanet, CosmicStarsCanvasProps, FrameKind, JourneyCrystalPinProps, JourneyStepProps, JourneyStepSize, JourneyStepType, KeycloakUser, RequiredClientRoles, SecurityContextType, SecurityProviderProps };