@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.
- package/CHANGELOG.md +17 -0
- package/dist/ai-check.cjs +2 -2
- package/dist/ai-check.d.cts +1 -1
- package/dist/ai-check.d.ts +1 -1
- package/dist/ai-check.js +2 -2
- package/dist/{ai-writing-DeIV-GfN.js → ai-writing-DQjI9EFN.js} +130 -5
- package/dist/ai-writing-DQjI9EFN.js.map +1 -0
- package/dist/{ai-writing-Bh2Y53cY.cjs → ai-writing-DbpZpGRk.cjs} +135 -4
- package/dist/ai-writing-DbpZpGRk.cjs.map +1 -0
- package/dist/{ai-Cnm0qE8v.d.cts → ai-zhc9yhRj.d.cts} +160 -2
- package/dist/ai-zhc9yhRj.d.cts.map +1 -0
- package/dist/{ai-Cnm0qE8v.d.ts → ai-zhc9yhRj.d.ts} +160 -2
- package/dist/ai-zhc9yhRj.d.ts.map +1 -0
- package/dist/{index-DMh3OYSb.d.cts → index-BeC8tAWf.d.cts} +2 -2
- package/dist/{index-DMh3OYSb.d.cts.map → index-BeC8tAWf.d.cts.map} +1 -1
- package/dist/{index-CtoPhJAH.d.ts → index-Byar5VVs.d.ts} +2 -2
- package/dist/{index-CtoPhJAH.d.ts.map → index-Byar5VVs.d.ts.map} +1 -1
- package/dist/{index-fZ67k-WR.d.cts → index-Ccj8oL_E.d.cts} +2 -2
- package/dist/{index-fZ67k-WR.d.cts.map → index-Ccj8oL_E.d.cts.map} +1 -1
- package/dist/{index-g-EWIugp.d.ts → index-CxkqS62X.d.ts} +89 -7
- package/dist/index-CxkqS62X.d.ts.map +1 -0
- package/dist/{index-oST8GBFa.d.cts → index-DLsUnGHt.d.cts} +89 -7
- package/dist/index-DLsUnGHt.d.cts.map +1 -0
- package/dist/{index-HXvg0YRQ.d.ts → index-f4YuMgFb.d.ts} +2 -2
- package/dist/{index-HXvg0YRQ.d.ts.map → index-f4YuMgFb.d.ts.map} +1 -1
- package/dist/index.cjs +8 -6
- package/dist/index.d.cts +40 -7
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +40 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -7
- package/dist/{item-group-BceUoxoM.js → item-group-CKZk3txt.js} +2 -2
- package/dist/{item-group-BceUoxoM.js.map → item-group-CKZk3txt.js.map} +1 -1
- package/dist/{item-group-KV4hYu3a.cjs → item-group-COP5OwEC.cjs} +2 -2
- package/dist/{item-group-KV4hYu3a.cjs.map → item-group-COP5OwEC.cjs.map} +1 -1
- package/dist/{registry-tkacvJUI.js → registry-Bw9grsCN.js} +321 -11
- package/dist/registry-Bw9grsCN.js.map +1 -0
- package/dist/{registry-Cymq7Ah0.cjs → registry-C9O9txy5.cjs} +332 -10
- package/dist/registry-C9O9txy5.cjs.map +1 -0
- package/dist/{schemas-DM8sN_f0.js → schemas-BJe3W6Xb.js} +3 -3
- package/dist/{schemas-DM8sN_f0.js.map → schemas-BJe3W6Xb.js.map} +1 -1
- package/dist/{schemas-wDzbKdKa.cjs → schemas-CXlemRvB.cjs} +3 -3
- package/dist/{schemas-wDzbKdKa.cjs.map → schemas-CXlemRvB.cjs.map} +1 -1
- package/dist/schemas.cjs +3 -3
- package/dist/schemas.d.cts +1 -1
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.js +3 -3
- package/dist/{scoring-DIBmo_cy.js → scoring-BGKdff2i.js} +214 -26
- package/dist/scoring-BGKdff2i.js.map +1 -0
- package/dist/{scoring-D9tFvPEG.cjs → scoring-Db1CZeAn.cjs} +219 -25
- package/dist/scoring-Db1CZeAn.cjs.map +1 -0
- package/dist/scoring.cjs +3 -2
- package/dist/scoring.d.cts +3 -3
- package/dist/scoring.d.ts +3 -3
- package/dist/scoring.js +3 -3
- package/dist/{xapi-gCAo549Q.js → xapi-BtBm8AWZ.js} +2 -2
- package/dist/{xapi-gCAo549Q.js.map → xapi-BtBm8AWZ.js.map} +1 -1
- package/dist/{xapi-Dyqcl3JK.cjs → xapi-DOAqH9__.cjs} +2 -2
- package/dist/{xapi-Dyqcl3JK.cjs.map → xapi-DOAqH9__.cjs.map} +1 -1
- package/dist/xapi.cjs +1 -1
- package/dist/xapi.d.cts +1 -1
- package/dist/xapi.d.ts +1 -1
- package/dist/xapi.js +1 -1
- package/package.json +1 -1
- package/vectors/scoring.json +11967 -1
- package/vectors/validation.json +1298 -1
- package/dist/ai-Cnm0qE8v.d.cts.map +0 -1
- package/dist/ai-Cnm0qE8v.d.ts.map +0 -1
- package/dist/ai-writing-Bh2Y53cY.cjs.map +0 -1
- package/dist/ai-writing-DeIV-GfN.js.map +0 -1
- package/dist/index-g-EWIugp.d.ts.map +0 -1
- package/dist/index-oST8GBFa.d.cts.map +0 -1
- package/dist/registry-Cymq7Ah0.cjs.map +0 -1
- package/dist/registry-tkacvJUI.js.map +0 -1
- package/dist/scoring-D9tFvPEG.cjs.map +0 -1
- 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-
|
|
3
|
-
const require_scoring = require("./scoring-
|
|
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
|
package/dist/ai-check.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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.
|
package/dist/ai-check.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
|
2
|
-
import {
|
|
3
|
-
import { a as INTERACTIVE_VIDEO_ITEM_TYPES, i as validateItemGroup, t as ItemGroupSchema, u as isInteractiveVideoItemType } from "./item-group-
|
|
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 {
|
|
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-
|
|
5557
|
+
//# sourceMappingURL=ai-writing-DQjI9EFN.js.map
|