@intellectif/lk-core 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/ai-check.cjs +2 -2
  3. package/dist/ai-check.d.cts +1 -1
  4. package/dist/ai-check.d.ts +1 -1
  5. package/dist/ai-check.js +2 -2
  6. package/dist/{ai-writing-DeIV-GfN.js → ai-writing-DQjI9EFN.js} +130 -5
  7. package/dist/ai-writing-DQjI9EFN.js.map +1 -0
  8. package/dist/{ai-writing-Bh2Y53cY.cjs → ai-writing-DbpZpGRk.cjs} +135 -4
  9. package/dist/ai-writing-DbpZpGRk.cjs.map +1 -0
  10. package/dist/{ai-Cnm0qE8v.d.cts → ai-zhc9yhRj.d.cts} +160 -2
  11. package/dist/ai-zhc9yhRj.d.cts.map +1 -0
  12. package/dist/{ai-Cnm0qE8v.d.ts → ai-zhc9yhRj.d.ts} +160 -2
  13. package/dist/ai-zhc9yhRj.d.ts.map +1 -0
  14. package/dist/{index-DMh3OYSb.d.cts → index-BeC8tAWf.d.cts} +2 -2
  15. package/dist/{index-DMh3OYSb.d.cts.map → index-BeC8tAWf.d.cts.map} +1 -1
  16. package/dist/{index-CtoPhJAH.d.ts → index-Byar5VVs.d.ts} +2 -2
  17. package/dist/{index-CtoPhJAH.d.ts.map → index-Byar5VVs.d.ts.map} +1 -1
  18. package/dist/{index-fZ67k-WR.d.cts → index-Ccj8oL_E.d.cts} +2 -2
  19. package/dist/{index-fZ67k-WR.d.cts.map → index-Ccj8oL_E.d.cts.map} +1 -1
  20. package/dist/{index-g-EWIugp.d.ts → index-CxkqS62X.d.ts} +89 -7
  21. package/dist/index-CxkqS62X.d.ts.map +1 -0
  22. package/dist/{index-oST8GBFa.d.cts → index-DLsUnGHt.d.cts} +89 -7
  23. package/dist/index-DLsUnGHt.d.cts.map +1 -0
  24. package/dist/{index-HXvg0YRQ.d.ts → index-f4YuMgFb.d.ts} +2 -2
  25. package/dist/{index-HXvg0YRQ.d.ts.map → index-f4YuMgFb.d.ts.map} +1 -1
  26. package/dist/index.cjs +8 -6
  27. package/dist/index.d.cts +40 -7
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.ts +40 -7
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +7 -7
  32. package/dist/{item-group-BceUoxoM.js → item-group-CKZk3txt.js} +2 -2
  33. package/dist/{item-group-BceUoxoM.js.map → item-group-CKZk3txt.js.map} +1 -1
  34. package/dist/{item-group-KV4hYu3a.cjs → item-group-COP5OwEC.cjs} +2 -2
  35. package/dist/{item-group-KV4hYu3a.cjs.map → item-group-COP5OwEC.cjs.map} +1 -1
  36. package/dist/{registry-tkacvJUI.js → registry-Bw9grsCN.js} +321 -11
  37. package/dist/registry-Bw9grsCN.js.map +1 -0
  38. package/dist/{registry-Cymq7Ah0.cjs → registry-C9O9txy5.cjs} +332 -10
  39. package/dist/registry-C9O9txy5.cjs.map +1 -0
  40. package/dist/{schemas-DM8sN_f0.js → schemas-BJe3W6Xb.js} +3 -3
  41. package/dist/{schemas-DM8sN_f0.js.map → schemas-BJe3W6Xb.js.map} +1 -1
  42. package/dist/{schemas-wDzbKdKa.cjs → schemas-CXlemRvB.cjs} +3 -3
  43. package/dist/{schemas-wDzbKdKa.cjs.map → schemas-CXlemRvB.cjs.map} +1 -1
  44. package/dist/schemas.cjs +3 -3
  45. package/dist/schemas.d.cts +1 -1
  46. package/dist/schemas.d.ts +1 -1
  47. package/dist/schemas.js +3 -3
  48. package/dist/{scoring-DIBmo_cy.js → scoring-BGKdff2i.js} +214 -26
  49. package/dist/scoring-BGKdff2i.js.map +1 -0
  50. package/dist/{scoring-D9tFvPEG.cjs → scoring-Db1CZeAn.cjs} +219 -25
  51. package/dist/scoring-Db1CZeAn.cjs.map +1 -0
  52. package/dist/scoring.cjs +3 -2
  53. package/dist/scoring.d.cts +3 -3
  54. package/dist/scoring.d.ts +3 -3
  55. package/dist/scoring.js +3 -3
  56. package/dist/{xapi-gCAo549Q.js → xapi-BtBm8AWZ.js} +2 -2
  57. package/dist/{xapi-gCAo549Q.js.map → xapi-BtBm8AWZ.js.map} +1 -1
  58. package/dist/{xapi-Dyqcl3JK.cjs → xapi-DOAqH9__.cjs} +2 -2
  59. package/dist/{xapi-Dyqcl3JK.cjs.map → xapi-DOAqH9__.cjs.map} +1 -1
  60. package/dist/xapi.cjs +1 -1
  61. package/dist/xapi.d.cts +1 -1
  62. package/dist/xapi.d.ts +1 -1
  63. package/dist/xapi.js +1 -1
  64. package/package.json +1 -1
  65. package/vectors/scoring.json +11967 -1
  66. package/vectors/validation.json +1298 -1
  67. package/dist/ai-Cnm0qE8v.d.cts.map +0 -1
  68. package/dist/ai-Cnm0qE8v.d.ts.map +0 -1
  69. package/dist/ai-writing-Bh2Y53cY.cjs.map +0 -1
  70. package/dist/ai-writing-DeIV-GfN.js.map +0 -1
  71. package/dist/index-g-EWIugp.d.ts.map +0 -1
  72. package/dist/index-oST8GBFa.d.cts.map +0 -1
  73. package/dist/registry-Cymq7Ah0.cjs.map +0 -1
  74. package/dist/registry-tkacvJUI.js.map +0 -1
  75. package/dist/scoring-D9tFvPEG.cjs.map +0 -1
  76. package/dist/scoring-DIBmo_cy.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @intellectif/lk-core
2
2
 
3
+ ## 1.9.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#141](https://github.com/intellectif/learning-kit/pull/141) [`d5b3a3c`](https://github.com/intellectif/learning-kit/commit/d5b3a3c60278555160734af845eb062d918cd083) Thanks [@diego28e](https://github.com/diego28e)! - **`speaking-response`: a learner answers a prompt out loud, graded on a rubric by a judge on the transcript and by the speech engine's measures**
8
+
9
+ **Action required:** none. Everything is new; read-aloud grades, written-response grades and stored content are unchanged.
10
+
11
+ - **The type `speaking-response`**, built in and deferred like `written-response`: a prompt (plain and rich), optional instructions and media (a picture to describe, a recording to answer), a canonical locale with a region, recording bounds, and a rubric whose criteria may name a `measure` — `pronunciation`, `fluency` or `prosody`. A criterion with a measure is scored from the engine; one without, by a judge. The response is a recording, `{ type: 'speaking-response', recording }`, with `recording: null` for a blank. Schema, strict redacted schema, field policy (the rubric is public, `measure` included), JSON Schema, xAPI definition, `createDraft` and seventeen `sr_*` draft checks.
12
+ - **Evidence:** `SpeechAssessment.transcript?: { text, source }` — the transcriber's verbatim text of an unscripted take, and who wrote it — which the engine measured the take against and the judge reads. `gradeReadAloud` keeps refusing unscripted evidence (`task_mismatch`).
13
+ - **`gradeSpeakingResponse(data, response, { assessment, judgement }, options)`:** each criterion scored once, by the judge (an `AiGradingJudgement` from `checkAiGrading`, or a person's marks in that shape) or from the engine's scores out of 100, unless `judgeMeasures` gives the judge those too; the total by `gradeFromRubric`. A blank is 0. Evidence it cannot tie to the item and the take is refused with `read-aloud`'s codes, plus `judgement_mismatch` for a judgement that does not score each of the judge's criteria exactly once on its 0..1 scale. A judged grade carries the judge's feedback, corrections and identity, and `routeGrade` and `calibrationReport` take the speaking item as their scope.
14
+ - **`aiSpeakingGradingRequest`** builds a judge's request (`feature: 'speaking-grading'`): the task, the transcript verbatim, only the criteria the judge scores, and the measured criteria with the engine's scores as context. It builds none for evidence the grade would refuse. `checkAiGrading` accepts it beside a written response's request; `aiGradingRequest` and its facts are unchanged.
15
+ - **Vectors:** 58 grade vectors — every refusal, every policy and measurement bound, judge and engine, judged measures, rounding — and the type's validation seed; no existing expectation changed. A mutation sweep of the grade leaves 5 of 121 mutants alive, none of which changes a grade: refusal wording, error wording, a missing measurement thrown as a `TypeError` either way, and an inherited `redacted` marker JSON cannot carry (a unit test pins it).
16
+ - **Why a minor:** additive. `SpeechUnscorableCode` gains `judgement_mismatch`, and `BUILT_IN_ACTIVITY_TYPES` gains the type: a TypeScript `switch` or `Record` that is exhaustive over either needs one more entry.
17
+
18
+ Guide: https://github.com/intellectif/learning-kit/blob/main/docs/speech-assessment.md#spoken-answers-19
19
+
3
20
  ## 1.8.0
4
21
 
5
22
  ### Minor Changes
package/dist/ai-check.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_ai_writing = require("./ai-writing-Bh2Y53cY.cjs");
3
- const require_scoring = require("./scoring-D9tFvPEG.cjs");
2
+ const require_ai_writing = require("./ai-writing-DbpZpGRk.cjs");
3
+ const require_scoring = require("./scoring-Db1CZeAn.cjs");
4
4
  // src/ai-check/cases.ts
5
5
  /**
6
6
  * The items the cases are built from. Small, ordinary language-course content
@@ -1,4 +1,4 @@
1
- import { $ as AiTextResult, E as AiExplanationRequest, L as AiGradingJudgement, R as AiGradingRequest, S as AiDrafts, V as AiHintRequest, Y as AiRefusal, a as AiCoachingRequest, dt as AiVariantsRequest, i as AiCoaching, l as AiCritique, m as AiCritiqueRequest, ut as AiVariants, vt as AiWritingFeedback, w as AiDraftsRequest, yt as AiWritingFeedbackRequest } from "./ai-Cnm0qE8v.cjs";
1
+ import { Ct as AiWritingFeedback, E as AiExplanationRequest, L as AiGradingJudgement, R as AiGradingRequest, S as AiDrafts, V as AiHintRequest, Y as AiRefusal, a as AiCoachingRequest, gt as AiVariantsRequest, ht as AiVariants, i as AiCoaching, it as AiTextResult, l as AiCritique, m as AiCritiqueRequest, w as AiDraftsRequest, wt as AiWritingFeedbackRequest } from "./ai-zhc9yhRj.cjs";
2
2
  /**
3
3
  * One call to make against a host's port, and what a learner was looking at
4
4
  * when the SDK would have made it.
@@ -1,4 +1,4 @@
1
- import { $ as AiTextResult, E as AiExplanationRequest, L as AiGradingJudgement, R as AiGradingRequest, S as AiDrafts, V as AiHintRequest, Y as AiRefusal, a as AiCoachingRequest, dt as AiVariantsRequest, i as AiCoaching, l as AiCritique, m as AiCritiqueRequest, ut as AiVariants, vt as AiWritingFeedback, w as AiDraftsRequest, yt as AiWritingFeedbackRequest } from "./ai-Cnm0qE8v.js";
1
+ import { Ct as AiWritingFeedback, E as AiExplanationRequest, L as AiGradingJudgement, R as AiGradingRequest, S as AiDrafts, V as AiHintRequest, Y as AiRefusal, a as AiCoachingRequest, gt as AiVariantsRequest, ht as AiVariants, i as AiCoaching, it as AiTextResult, l as AiCritique, m as AiCritiqueRequest, w as AiDraftsRequest, wt as AiWritingFeedbackRequest } from "./ai-zhc9yhRj.js";
2
2
  /**
3
3
  * One call to make against a host's port, and what a learner was looking at
4
4
  * when the SDK would have made it.
package/dist/ai-check.js CHANGED
@@ -1,5 +1,5 @@
1
- import { E as checkAiCritique, T as aiCritiqueRequest, X as aiCoachingRequest, Z as checkAiCoaching, b as checkAiDrafts, c as aiVariantsRequest, ct as checkAiHint, f as aiGradingRequest, it as aiHintRequest, l as checkAiVariants, n as checkAiWritingFeedback, nt as aiExplanationRequest, p as checkAiGrading, st as checkAiExplanation, t as aiWritingFeedbackRequest, y as aiDraftsRequest } from "./ai-writing-DeIV-GfN.js";
2
- import { o as gradeReadAloud } from "./scoring-DIBmo_cy.js";
1
+ import { D as checkAiCritique, E as aiCritiqueRequest, Q as checkAiCoaching, Z as aiCoachingRequest, at as aiHintRequest, b as aiDraftsRequest, c as aiVariantsRequest, ct as checkAiExplanation, f as aiGradingRequest, l as checkAiVariants, lt as checkAiHint, m as checkAiGrading, n as checkAiWritingFeedback, rt as aiExplanationRequest, t as aiWritingFeedbackRequest, x as checkAiDrafts } from "./ai-writing-DQjI9EFN.js";
2
+ import { s as gradeReadAloud } from "./scoring-BGKdff2i.js";
3
3
  // src/ai-check/cases.ts
4
4
  /**
5
5
  * The items the cases are built from. Small, ordinary language-course content
@@ -1,6 +1,6 @@
1
- import { A as normaliseFinding, B as checkMedia, Ct as revealsAnswer, F as levelDistribution, G as isUnset, H as covers, I as levelKey, J as pathKey, K as isUnwritten, L as readRubricLevels, O as keyPositionFinding, P as LEVEL_PROBABILITY_TOLERANCE, Q as groupCaptionsField, R as countWords, St as placeholderOrder, Tt as PLACEHOLDER_RE, U as isMissingId, V as coveredPathsOf, W as isRecord$8, Y as refusesEmpty, Z as GROUP_CAPTIONS_REVEAL_DICTATION, a as readSchema, bt as numberedPassage, it as alignDictation, j as policyFor, k as finding, mt as withValidationScope, nt as UnknownActivityTypeError, q as issue, t as getActivityTypeDescriptor, vt as containsWords, xt as passageWithoutPlaceholders, yt as fold, z as DRAFT_ISSUE_SEVERITY } from "./registry-tkacvJUI.js";
2
- import { F as isGradeInRange, S as canonicalJson, _ as gradeFromRubric, c as validateSpeechAssessment, h as seededShuffle, r as score, s as alignReadAloud } from "./scoring-DIBmo_cy.js";
3
- import { a as INTERACTIVE_VIDEO_ITEM_TYPES, i as validateItemGroup, t as ItemGroupSchema, u as isInteractiveVideoItemType } from "./item-group-BceUoxoM.js";
1
+ import { $ as GROUP_CAPTIONS_REVEAL_DICTATION, A as keyPositionFinding, B as countWords, Ct as passageWithoutPlaceholders, Dt as PLACEHOLDER_RE, G as isMissingId, H as checkMedia, I as LEVEL_PROBABILITY_TOLERANCE, J as isUnwritten, K as isRecord$8, L as levelDistribution, M as normaliseFinding, N as policyFor, R as levelKey, St as numberedPassage, Tt as revealsAnswer, U as coveredPathsOf, V as DRAFT_ISSUE_SEVERITY, W as covers, X as pathKey, Y as issue, Z as refusesEmpty, a as readSchema, bt as containsWords, et as groupCaptionsField, gt as withValidationScope, it as UnknownActivityTypeError, j as finding, ot as alignDictation, q as isUnset, t as getActivityTypeDescriptor, v as SPEAKING_MEASURES, wt as placeholderOrder, xt as fold, z as readRubricLevels } from "./registry-Bw9grsCN.js";
2
+ import { C as canonicalJson, I as isGradeInRange, c as alignReadAloud, g as seededShuffle, l as validateSpeechAssessment, r as score, v as gradeFromRubric } from "./scoring-BGKdff2i.js";
3
+ import { a as INTERACTIVE_VIDEO_ITEM_TYPES, i as validateItemGroup, t as ItemGroupSchema, u as isInteractiveVideoItemType } from "./item-group-CKZk3txt.js";
4
4
  // src/ai-material.ts
5
5
  /**
6
6
  * What a model is told about the group a question sits in: the material the
@@ -3508,6 +3508,131 @@ function aiGradingRequest(input) {
3508
3508
  }
3509
3509
  };
3510
3510
  }
3511
+ const MEASURES = SPEAKING_MEASURES;
3512
+ /**
3513
+ * The request for a model's grade of a spoken answer (1.9), or why there is
3514
+ * none to make.
3515
+ *
3516
+ * Built as a written response's is, on the server and from the whole item, with
3517
+ * the take's evidence: the model reads `assessment.transcript` — the
3518
+ * transcriber's verbatim text, the same text the engine measured the take
3519
+ * against — and scores the criteria a judge scores: those that name no
3520
+ * `measure`, or every criterion when `judgeMeasures` is set. The measured
3521
+ * criteria go with it as context, with the engine's scores, so feedback can
3522
+ * speak of them; the model does not score them.
3523
+ *
3524
+ * The evidence is checked as `gradeSpeakingResponse` checks it — valid,
3525
+ * unscripted, for this item's locale and this response's recording — so a model
3526
+ * is never paid to judge a take the grade would refuse. Read the reply with
3527
+ * `checkAiGrading`, and grade with `gradeSpeakingResponse` under the same
3528
+ * `judgeMeasures`.
3529
+ */
3530
+ function aiSpeakingGradingRequest(input) {
3531
+ const { data, response, learnerLocale } = input;
3532
+ if (data.type !== "speaking-response") return {
3533
+ ok: false,
3534
+ problem: "not-speaking-response"
3535
+ };
3536
+ if (data.redacted === true) return {
3537
+ ok: false,
3538
+ problem: "redacted"
3539
+ };
3540
+ const item = data;
3541
+ const rubric = rubricFacts(item.rubric);
3542
+ if (!rubric.ok) return rubric;
3543
+ const authored = item.rubric.criteria;
3544
+ const judged = [];
3545
+ const measured = [];
3546
+ for (const [index, fact] of rubric.criteria.entries()) {
3547
+ const measure = authored[index].measure;
3548
+ if (measure !== void 0 && !MEASURES.includes(measure)) return {
3549
+ ok: false,
3550
+ problem: "no-rubric",
3551
+ path: [
3552
+ "rubric",
3553
+ "criteria",
3554
+ index,
3555
+ "measure"
3556
+ ]
3557
+ };
3558
+ if (measure === void 0 || input.judgeMeasures === true) judged.push({
3559
+ ...fact,
3560
+ ...measure !== void 0 ? { measure } : {}
3561
+ });
3562
+ else measured.push({
3563
+ name: fact.name,
3564
+ measure,
3565
+ weight: fact.weight
3566
+ });
3567
+ }
3568
+ if (judged.length === 0) return {
3569
+ ok: false,
3570
+ problem: "nothing-to-judge"
3571
+ };
3572
+ const recording = response?.type === "speaking-response" ? response.recording : null;
3573
+ if (recording === null || recording === void 0) return {
3574
+ ok: false,
3575
+ problem: "empty-response"
3576
+ };
3577
+ const checked = input.assessment === null || input.assessment === void 0 ? void 0 : validateSpeechAssessment(input.assessment);
3578
+ if (checked === void 0 || !checked.success) return {
3579
+ ok: false,
3580
+ problem: "invalid-assessment"
3581
+ };
3582
+ const evidence = checked.data;
3583
+ if (evidence.status === "no_speech") return {
3584
+ ok: false,
3585
+ problem: "empty-response"
3586
+ };
3587
+ if (evidence.task !== "unscripted" || evidence.locale !== item.locale || evidence.recordingKey !== recording.key) return {
3588
+ ok: false,
3589
+ problem: "evidence-mismatch"
3590
+ };
3591
+ if (evidence.transcript === void 0) return {
3592
+ ok: false,
3593
+ problem: "no-transcript"
3594
+ };
3595
+ const text = evidence.transcript.text;
3596
+ const scores = evidence.scores;
3597
+ const scoreOf = {
3598
+ pronunciation: scores.accuracy,
3599
+ fluency: scores.fluency,
3600
+ prosody: scores.prosody
3601
+ };
3602
+ const media = isRecord$1(item.media) && typeof item.media.type === "string" ? item.media : void 0;
3603
+ const material = materialFacts(input.group);
3604
+ return {
3605
+ ok: true,
3606
+ request: {
3607
+ feature: "speaking-grading",
3608
+ facts: {
3609
+ activityType: "speaking-response",
3610
+ activityId: data.id,
3611
+ title: data.title,
3612
+ locale: item.locale,
3613
+ ...typeof item.instructions === "string" ? { instructions: item.instructions } : {},
3614
+ prompt: typeof item.prompt === "string" ? item.prompt : "",
3615
+ ...media !== void 0 ? { media: {
3616
+ type: media.type,
3617
+ ...typeof media.alt === "string" ? { alt: media.alt } : {}
3618
+ } } : {},
3619
+ text,
3620
+ wordCount: countWords(text),
3621
+ rubric: judged,
3622
+ measured: measured.map((fact) => {
3623
+ const score = scoreOf[fact.measure];
3624
+ return score !== void 0 ? {
3625
+ ...fact,
3626
+ score
3627
+ } : fact;
3628
+ }),
3629
+ ...typeof item.languageTarget === "string" ? { languageTarget: item.languageTarget } : {}
3630
+ },
3631
+ ...material !== null ? { material } : {},
3632
+ ...learnerLocale !== void 0 ? { learnerLocale } : {}
3633
+ }
3634
+ };
3635
+ }
3511
3636
  /** The rubric as a model is given it, each criterion's levels read. */
3512
3637
  function rubricFacts(rubric) {
3513
3638
  const listed = isRecord$1(rubric) ? rubric.criteria : void 0;
@@ -5427,6 +5552,6 @@ function checkAiWritingFeedback(raw, request) {
5427
5552
  }
5428
5553
  };
5429
5554
  }
5430
- export { AI_HINT_TYPES as $, createInteractiveVideoDraft as A, sharedAnswers as B, AI_CRITIQUE_MAX_FIELD_LENGTH as C, createDraft as D, checkAiCritique as E, AI_VARIANT_LENGTH_BANDS as F, listMediaRefs as G, structureMisses as H, AI_VARIANT_NEAR_COPY_THRESHOLD as I, AI_COACHING_MAX_TIP_LENGTH as J, mapMediaRefs as K, keysOf as L, critiqueDrafts as M, critiqueItemGroupDraft as N, critiqueDraft as O, validateItemGroupDraft as P, AI_EXPLANATION_TYPES as Q, lengthMisses as R, interactiveVideoFromDrafts as S, aiCritiqueRequest as T, textSimilarity as U, shownScore as V, textsOf as W, aiCoachingRequest as X, AI_COACHING_MAX_WORDS as Y, checkAiCoaching as Z, AI_DRAFTS_MAX_REPAIRS as _, AI_VARIANTS_MAX_REPAIRS as a, aiSupports as at, checkAiDrafts as b, aiVariantsRequest as c, checkAiHint as ct, AI_GRADING_PROBABILITY_TOLERANCE as d, AI_MATERIAL_MAX_LENGTH as dt, AI_TEXT_MAX_LENGTH as et, aiGradingRequest as f, AI_DRAFTS_MAX_COUNT as g, AI_WRITING_MAX_FIELD_LENGTH as h, AI_VARIANTS_MAX_MATERIAL_LENGTH as i, aiHintRequest as it, createItemGroupDraft as j, validateDraft as k, checkAiVariants as l, hintRevealsAnswer as lt, AI_WRITING_MAX_CORRECTIONS as m, checkAiWritingFeedback as n, aiExplanationRequest as nt, AI_VARIANT_CODE_SEVERITY as o, buildAiFacts as ot, checkAiGrading as p, transcriptOf as q, AI_VARIANTS_MAX_EXEMPLARS as r, aiGradeOf as rt, aiVariantsRepairRequest as s, checkAiExplanation as st, aiWritingFeedbackRequest as t, aiAllowedByContent as tt, generateVariants as u, readAiTextResult as ut, aiDraftsRepairRequest as v, AI_CRITIQUE_MAX_FINDINGS as w, generateDrafts as x, aiDraftsRequest as y, optionSet as z };
5555
+ export { AI_EXPLANATION_TYPES as $, validateDraft as A, optionSet as B, interactiveVideoFromDrafts as C, checkAiCritique as D, aiCritiqueRequest as E, validateItemGroupDraft as F, textsOf as G, shownScore as H, AI_VARIANT_LENGTH_BANDS as I, transcriptOf as J, listMediaRefs as K, AI_VARIANT_NEAR_COPY_THRESHOLD as L, createItemGroupDraft as M, critiqueDrafts as N, createDraft as O, critiqueItemGroupDraft as P, checkAiCoaching as Q, keysOf as R, generateDrafts as S, AI_CRITIQUE_MAX_FINDINGS as T, structureMisses as U, sharedAnswers as V, textSimilarity as W, AI_COACHING_MAX_WORDS as X, AI_COACHING_MAX_TIP_LENGTH as Y, aiCoachingRequest as Z, AI_DRAFTS_MAX_COUNT as _, AI_VARIANTS_MAX_REPAIRS as a, aiHintRequest as at, aiDraftsRequest as b, aiVariantsRequest as c, checkAiExplanation as ct, AI_GRADING_PROBABILITY_TOLERANCE as d, readAiTextResult as dt, AI_HINT_TYPES as et, aiGradingRequest as f, AI_MATERIAL_MAX_LENGTH as ft, AI_WRITING_MAX_FIELD_LENGTH as g, AI_WRITING_MAX_CORRECTIONS as h, AI_VARIANTS_MAX_MATERIAL_LENGTH as i, aiGradeOf as it, createInteractiveVideoDraft as j, critiqueDraft as k, checkAiVariants as l, checkAiHint as lt, checkAiGrading as m, checkAiWritingFeedback as n, aiAllowedByContent as nt, AI_VARIANT_CODE_SEVERITY as o, aiSupports as ot, aiSpeakingGradingRequest as p, mapMediaRefs as q, AI_VARIANTS_MAX_EXEMPLARS as r, aiExplanationRequest as rt, aiVariantsRepairRequest as s, buildAiFacts as st, aiWritingFeedbackRequest as t, AI_TEXT_MAX_LENGTH as tt, generateVariants as u, hintRevealsAnswer as ut, AI_DRAFTS_MAX_REPAIRS as v, AI_CRITIQUE_MAX_FIELD_LENGTH as w, checkAiDrafts as x, aiDraftsRepairRequest as y, lengthMisses as z };
5431
5556
 
5432
- //# sourceMappingURL=ai-writing-DeIV-GfN.js.map
5557
+ //# sourceMappingURL=ai-writing-DQjI9EFN.js.map