@intellectif/lk-core 0.7.1 → 0.8.1

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 (46) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +2 -0
  3. package/dist/{activity-DARHcrz_.d.cts → activity-CPtJUBek.d.cts} +65 -2
  4. package/dist/{activity-DARHcrz_.d.ts → activity-CPtJUBek.d.ts} +65 -2
  5. package/dist/{chunk-XL75ZZVM.js → chunk-2M76F32Y.js} +10 -6
  6. package/dist/chunk-2M76F32Y.js.map +1 -0
  7. package/dist/{chunk-AFIQQADJ.cjs → chunk-7ACNBDSF.cjs} +4 -4
  8. package/dist/{chunk-AFIQQADJ.cjs.map → chunk-7ACNBDSF.cjs.map} +1 -1
  9. package/dist/{chunk-5RE3ZRSA.cjs → chunk-FKH4YT5X.cjs} +134 -18
  10. package/dist/chunk-FKH4YT5X.cjs.map +1 -0
  11. package/dist/{chunk-7NIH5IL3.cjs → chunk-FVLKIL6W.cjs} +19 -15
  12. package/dist/chunk-FVLKIL6W.cjs.map +1 -0
  13. package/dist/{chunk-YCXIHFLG.js → chunk-HCOWSGEZ.js} +127 -11
  14. package/dist/chunk-HCOWSGEZ.js.map +1 -0
  15. package/dist/{chunk-NOBJYDOB.js → chunk-LNA33IK7.js} +2 -2
  16. package/dist/{chunk-2SQ75JTE.js → chunk-NHGXOOZ2.js} +2 -2
  17. package/dist/{chunk-MVZKEWZN.cjs → chunk-YJZY5TPY.cjs} +8 -8
  18. package/dist/{chunk-MVZKEWZN.cjs.map → chunk-YJZY5TPY.cjs.map} +1 -1
  19. package/dist/{index-BfLwCMXN.d.cts → index-BvrA8nIV.d.ts} +353 -9
  20. package/dist/{index-yrUw7NzZ.d.ts → index-gIN564mV.d.cts} +353 -9
  21. package/dist/index.cjs +177 -27
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +173 -5
  24. package/dist/index.d.ts +173 -5
  25. package/dist/index.js +157 -7
  26. package/dist/index.js.map +1 -1
  27. package/dist/schemas.cjs +9 -3
  28. package/dist/schemas.cjs.map +1 -1
  29. package/dist/schemas.d.cts +2 -2
  30. package/dist/schemas.d.ts +2 -2
  31. package/dist/schemas.js +8 -2
  32. package/dist/scoring.cjs +3 -3
  33. package/dist/scoring.d.cts +2 -2
  34. package/dist/scoring.d.ts +2 -2
  35. package/dist/scoring.js +2 -2
  36. package/dist/xapi.cjs +3 -3
  37. package/dist/xapi.d.cts +1 -1
  38. package/dist/xapi.d.ts +1 -1
  39. package/dist/xapi.js +2 -2
  40. package/package.json +2 -1
  41. package/dist/chunk-5RE3ZRSA.cjs.map +0 -1
  42. package/dist/chunk-7NIH5IL3.cjs.map +0 -1
  43. package/dist/chunk-XL75ZZVM.js.map +0 -1
  44. package/dist/chunk-YCXIHFLG.js.map +0 -1
  45. /package/dist/{chunk-NOBJYDOB.js.map → chunk-LNA33IK7.js.map} +0 -0
  46. /package/dist/{chunk-2SQ75JTE.js.map → chunk-NHGXOOZ2.js.map} +0 -0
package/dist/index.cjs CHANGED
@@ -10,14 +10,14 @@
10
10
 
11
11
 
12
12
 
13
- var _chunkMVZKEWZNcjs = require('./chunk-MVZKEWZN.cjs');
13
+ var _chunkYJZY5TPYcjs = require('./chunk-YJZY5TPY.cjs');
14
14
 
15
15
 
16
16
 
17
17
 
18
18
 
19
19
 
20
- var _chunkAFIQQADJcjs = require('./chunk-AFIQQADJ.cjs');
20
+ var _chunk7ACNBDSFcjs = require('./chunk-7ACNBDSF.cjs');
21
21
 
22
22
 
23
23
 
@@ -31,7 +31,7 @@ var _chunkAFIQQADJcjs = require('./chunk-AFIQQADJ.cjs');
31
31
 
32
32
 
33
33
 
34
- var _chunk7NIH5IL3cjs = require('./chunk-7NIH5IL3.cjs');
34
+ var _chunkFVLKIL6Wcjs = require('./chunk-FVLKIL6W.cjs');
35
35
 
36
36
 
37
37
 
@@ -63,7 +63,11 @@ var _chunk7NIH5IL3cjs = require('./chunk-7NIH5IL3.cjs');
63
63
 
64
64
 
65
65
 
66
- var _chunk5RE3ZRSAcjs = require('./chunk-5RE3ZRSA.cjs');
66
+
67
+
68
+
69
+
70
+ var _chunkFKH4YT5Xcjs = require('./chunk-FKH4YT5X.cjs');
67
71
 
68
72
  // src/content-hash.ts
69
73
  function canonicalJson(value, seen = /* @__PURE__ */ new Set()) {
@@ -228,6 +232,99 @@ function flattenSequence(entries, options = {}) {
228
232
  return slots;
229
233
  }
230
234
 
235
+ // src/media-budget.ts
236
+ function entryKeyOf(slotId) {
237
+ const dot = slotId.indexOf(".");
238
+ return dot === -1 ? slotId : slotId.slice(0, dot);
239
+ }
240
+ function slotMediaKey(slotId) {
241
+ return `slot:${slotId}`;
242
+ }
243
+ function stimulusMediaKey(slotId) {
244
+ return `stimulus:${entryKeyOf(slotId)}`;
245
+ }
246
+ function resolvePlaybackPolicy(media) {
247
+ const p = media.playback;
248
+ const budgeted = typeof _optionalChain([p, 'optionalAccess', _ => _.maxPlays]) === "number";
249
+ const seek = _nullishCoalesce(_optionalChain([p, 'optionalAccess', _2 => _2.seek]), () => ( (budgeted ? "none" : "allow")));
250
+ const rate = _nullishCoalesce(_optionalChain([p, 'optionalAccess', _3 => _3.rate]), () => ( "allow"));
251
+ const controls = _nullishCoalesce(_optionalChain([p, 'optionalAccess', _4 => _4.controls]), () => ( (budgeted || seek === "none" || rate === "fixed" ? "minimal" : "native")));
252
+ return {
253
+ controls,
254
+ maxPlays: budgeted ? _optionalChain([p, 'optionalAccess', _5 => _5.maxPlays]) : null,
255
+ seek,
256
+ rate,
257
+ nativeControlHints: _nullishCoalesce(_optionalChain([p, 'optionalAccess', _6 => _6.nativeControlHints]), () => ( []))
258
+ };
259
+ }
260
+ function planMediaBudgets(plan) {
261
+ const out = {};
262
+ for (const slot of plan.slots) {
263
+ for (const budget of _nullishCoalesce(slot.mediaBudgets, () => ( []))) {
264
+ out[budget.key] = budget.maxPlays;
265
+ }
266
+ }
267
+ return out;
268
+ }
269
+ function assertEntry(key, entry) {
270
+ if (entry === null || typeof entry !== "object" || !Number.isInteger(entry.plays) || entry.plays < 0) {
271
+ throw new Error(
272
+ `serializeMediaPlayLedger: play count for ${JSON.stringify(key)} is ${JSON.stringify(_optionalChain([entry, 'optionalAccess', _7 => _7.plays]))}. A count must be a non-negative integer; Number(a NULL column) is the usual cause.`
273
+ );
274
+ }
275
+ if (entry.at !== void 0 && (!Number.isFinite(entry.at) || entry.at < 0)) {
276
+ throw new Error(
277
+ `serializeMediaPlayLedger: position for ${JSON.stringify(key)} is ${JSON.stringify(entry.at)}. A position must be a finite number of seconds >= 0.`
278
+ );
279
+ }
280
+ }
281
+ function serializeMediaPlayLedger(plan, entries, options = {}) {
282
+ if (entries === null || typeof entries !== "object") {
283
+ throw new Error("serializeMediaPlayLedger: entries must be an object keyed by media key.");
284
+ }
285
+ const budgets = planMediaBudgets(plan);
286
+ const out = {};
287
+ for (const key of Object.keys(entries)) {
288
+ if (!Object.hasOwn(budgets, key)) {
289
+ throw new Error(
290
+ `serializeMediaPlayLedger: media play recorded against a recording the plan does not budget: ${JSON.stringify(key)}. Keys come from slotMediaKey() / stimulusMediaKey(); a key that belongs to no budgeted media means the client and the plan disagree about which paper this is.`
291
+ );
292
+ }
293
+ const entry = entries[key];
294
+ assertEntry(key, entry);
295
+ out[key] = { plays: entry.plays, ...entry.at !== void 0 ? { at: entry.at } : {} };
296
+ }
297
+ return {
298
+ ledgerVersion: "1.0",
299
+ planHash: plan.planHash,
300
+ entries: out,
301
+ ...options.savedAt !== void 0 ? { savedAt: options.savedAt } : {}
302
+ };
303
+ }
304
+ function restoreMediaPlayLedger(plan, stored) {
305
+ if (stored === null || typeof stored !== "object") {
306
+ throw new Error("restoreMediaPlayLedger: the stored ledger is not an object.");
307
+ }
308
+ if (stored.ledgerVersion !== "1.0") {
309
+ throw new Error(
310
+ `restoreMediaPlayLedger: unsupported ledgerVersion ${JSON.stringify(stored.ledgerVersion)}. This build understands "1.0"; a newer ledger must be migrated before it is restored.`
311
+ );
312
+ }
313
+ if (stored.entries === null || typeof stored.entries !== "object") {
314
+ throw new Error(
315
+ "restoreMediaPlayLedger: the ledger carries no entries object (a NULL column, or a partially written row)."
316
+ );
317
+ }
318
+ if (stored.planHash !== plan.planHash) {
319
+ throw new Error(
320
+ `restoreMediaPlayLedger: this ledger belongs to a different paper (ledger ${stored.planHash}, plan ${plan.planHash}). Restoring it would hold the learner to a play budget from an exam they never sat.`
321
+ );
322
+ }
323
+ return serializeMediaPlayLedger(plan, stored.entries, {
324
+ ...stored.savedAt !== void 0 ? { savedAt: stored.savedAt } : {}
325
+ });
326
+ }
327
+
231
328
  // src/attempt-plan.ts
232
329
  function contentOf(activity) {
233
330
  if (!Object.hasOwn(activity, "slotKey")) {
@@ -236,12 +333,50 @@ function contentOf(activity) {
236
333
  const { slotKey: _slotKey, ...content } = activity;
237
334
  return content;
238
335
  }
336
+ function mediaBudgetsOf(slot) {
337
+ const budgets = [];
338
+ const own = slot.activity.media;
339
+ if (own !== void 0) {
340
+ const maxPlays = resolvePlaybackPolicy(own).maxPlays;
341
+ if (maxPlays !== null) {
342
+ budgets.push({ key: slotMediaKey(slot.slotId), maxPlays });
343
+ }
344
+ }
345
+ const stimulusMedia = _optionalChain([slot, 'access', _8 => _8.group, 'optionalAccess', _9 => _9.stimulus, 'access', _10 => _10.media]);
346
+ if (stimulusMedia !== void 0) {
347
+ const maxPlays = resolvePlaybackPolicy(stimulusMedia).maxPlays;
348
+ if (maxPlays !== null) {
349
+ budgets.push({ key: stimulusMediaKey(slot.slotId), maxPlays });
350
+ }
351
+ }
352
+ return budgets.length > 0 ? budgets : void 0;
353
+ }
354
+ function assertNoSplitBudgets(slots) {
355
+ const keysByUrl = /* @__PURE__ */ new Map();
356
+ for (const slot of slots) {
357
+ const own = slot.activity.media;
358
+ if (own === void 0 || resolvePlaybackPolicy(own).maxPlays === null) {
359
+ continue;
360
+ }
361
+ const keys = _nullishCoalesce(keysByUrl.get(own.url), () => ( []));
362
+ keys.push(slotMediaKey(slot.slotId));
363
+ keysByUrl.set(own.url, keys);
364
+ }
365
+ for (const [url, keys] of keysByUrl) {
366
+ if (keys.length > 1) {
367
+ throw new Error(
368
+ `planAttempt: media ${JSON.stringify(url)} is budgeted under ${keys.length} separate keys (${keys.join(", ")}), so one recording grants ${keys.length} \xD7 maxPlays. Put the questions that share a recording in an item group \u2014 a group's stimulus is one recording with one budget.`
369
+ );
370
+ }
371
+ }
372
+ }
239
373
  function planSlot(slot, points) {
240
374
  if (!Number.isFinite(points) || points < 0) {
241
375
  throw new Error(
242
376
  `planAttempt: slot "${slot.slotId}" resolved to ${String(points)} points. Points must be a finite, non-negative number, or the paper has no defensible total.`
243
377
  );
244
378
  }
379
+ const mediaBudgets = mediaBudgetsOf(slot);
245
380
  return {
246
381
  slotId: slot.slotId,
247
382
  index: slot.index,
@@ -255,7 +390,8 @@ function planSlot(slot, points) {
255
390
  ...slot.group.title !== void 0 ? { title: slot.group.title } : {},
256
391
  stimulusHash: contentHash(slot.group.stimulus)
257
392
  }
258
- } : {}
393
+ } : {},
394
+ ...mediaBudgets !== void 0 ? { mediaBudgets } : {}
259
395
  };
260
396
  }
261
397
  function planAttempt(entries, options = {}) {
@@ -264,7 +400,8 @@ function planAttempt(entries, options = {}) {
264
400
  ...shuffleEntries !== void 0 ? { shuffleEntries } : {},
265
401
  ...seed !== void 0 ? { seed } : {}
266
402
  });
267
- const planned = slots.map((slot) => planSlot(slot, _nullishCoalesce(_optionalChain([points, 'optionalCall', _ => _(slot)]), () => ( 1))));
403
+ assertNoSplitBudgets(slots);
404
+ const planned = slots.map((slot) => planSlot(slot, _nullishCoalesce(_optionalChain([points, 'optionalCall', _11 => _11(slot)]), () => ( 1))));
268
405
  const totalPoints = planned.reduce((sum, slot) => sum + slot.points, 0);
269
406
  return {
270
407
  planVersion: "1.0",
@@ -295,7 +432,7 @@ function verifyAttemptPlan(plan, current) {
295
432
  if (now.contentHash !== slot.contentHash) {
296
433
  changedSlotIds.push(slot.slotId);
297
434
  }
298
- if (_optionalChain([now, 'access', _2 => _2.group, 'optionalAccess', _3 => _3.stimulusHash]) !== _optionalChain([slot, 'access', _4 => _4.group, 'optionalAccess', _5 => _5.stimulusHash])) {
435
+ if (_optionalChain([now, 'access', _12 => _12.group, 'optionalAccess', _13 => _13.stimulusHash]) !== _optionalChain([slot, 'access', _14 => _14.group, 'optionalAccess', _15 => _15.stimulusHash])) {
299
436
  changedStimulusSlotIds.push(slot.slotId);
300
437
  }
301
438
  if (now.points !== slot.points) {
@@ -455,6 +592,9 @@ function keepField(sensitivity, reveal) {
455
592
  }
456
593
  return sensitivity === "answer-key" && reveal === "after-submit";
457
594
  }
595
+ function isEmptyObject(value) {
596
+ return typeof value === "object" && value !== null && !Array.isArray(value) && Object.keys(value).length === 0;
597
+ }
458
598
  function redactValue(value, policy, reveal) {
459
599
  if (Array.isArray(value)) {
460
600
  return value.map((element) => redactValue(element, policy, reveal));
@@ -479,7 +619,7 @@ function redactValue(value, policy, reveal) {
479
619
  continue;
480
620
  }
481
621
  const nested = redactValue(fieldValue, classification, reveal);
482
- if (nested !== void 0) {
622
+ if (nested !== void 0 && !isEmptyObject(nested)) {
483
623
  output[key] = nested;
484
624
  }
485
625
  }
@@ -487,9 +627,9 @@ function redactValue(value, policy, reveal) {
487
627
  }
488
628
  function redact(data, options = {}) {
489
629
  const reveal = _nullishCoalesce(options.reveal, () => ( "none"));
490
- const descriptor = _chunk5RE3ZRSAcjs.getActivityTypeDescriptor.call(void 0, data.type);
630
+ const descriptor = _chunkFKH4YT5Xcjs.getActivityTypeDescriptor.call(void 0, data.type);
491
631
  if (descriptor === void 0) {
492
- throw new (0, _chunk5RE3ZRSAcjs.UnknownActivityTypeError)(String(data.type));
632
+ throw new (0, _chunkFKH4YT5Xcjs.UnknownActivityTypeError)(String(data.type));
493
633
  }
494
634
  if (descriptor.fieldPolicy === void 0) {
495
635
  throw new Error(
@@ -502,7 +642,7 @@ function redact(data, options = {}) {
502
642
  if (reveal === "none" && descriptor.redactedSchema !== void 0) {
503
643
  const parsed = descriptor.redactedSchema.safeParse(result);
504
644
  if (!parsed.success) {
505
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(
645
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(
506
646
  descriptor.type,
507
647
  parsed.error.issues.map((issue) => ({
508
648
  path: issue.path.map(String),
@@ -516,13 +656,13 @@ function redact(data, options = {}) {
516
656
  }
517
657
  function assertRedacted(data) {
518
658
  if (typeof data !== "object" || data === null) {
519
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)("unknown", [
659
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)("unknown", [
520
660
  { path: [], message: "Redacted activity data must be an object.", code: "invalid_type" }
521
661
  ]);
522
662
  }
523
663
  const candidate = data;
524
664
  if (candidate.redacted !== true) {
525
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(String(_nullishCoalesce(candidate.type, () => ( "unknown"))), [
665
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(String(_nullishCoalesce(candidate.type, () => ( "unknown"))), [
526
666
  {
527
667
  path: ["redacted"],
528
668
  message: "Missing redacted marker \u2014 this payload is not a redact() projection.",
@@ -531,12 +671,12 @@ function assertRedacted(data) {
531
671
  ]);
532
672
  }
533
673
  const type = typeof candidate.type === "string" ? candidate.type : "";
534
- const descriptor = _chunk5RE3ZRSAcjs.getActivityTypeDescriptor.call(void 0, type);
674
+ const descriptor = _chunkFKH4YT5Xcjs.getActivityTypeDescriptor.call(void 0, type);
535
675
  if (descriptor === void 0) {
536
- throw new (0, _chunk5RE3ZRSAcjs.UnknownActivityTypeError)(type);
676
+ throw new (0, _chunkFKH4YT5Xcjs.UnknownActivityTypeError)(type);
537
677
  }
538
678
  if (descriptor.redactedSchema === void 0) {
539
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(descriptor.type, [
679
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(descriptor.type, [
540
680
  {
541
681
  path: [],
542
682
  message: `Activity type "${descriptor.type}" registers no redactedSchema; assertRedacted cannot prove this payload is learner-safe.`,
@@ -546,7 +686,7 @@ function assertRedacted(data) {
546
686
  }
547
687
  const parsed = descriptor.redactedSchema.safeParse(candidate);
548
688
  if (!parsed.success) {
549
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(
689
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(
550
690
  descriptor.type,
551
691
  parsed.error.issues.map((issue) => ({
552
692
  path: issue.path.map(String),
@@ -562,7 +702,7 @@ var STIMULUS_FIELD_POLICY = {
562
702
  title: "public",
563
703
  body: "public",
564
704
  bodyHtml: "public",
565
- media: "public",
705
+ media: _chunkFKH4YT5Xcjs.MEDIA_FIELD_POLICY,
566
706
  locale: "public",
567
707
  attribution: "public",
568
708
  transcript: "author-only"
@@ -588,9 +728,9 @@ function redactItemGroup(group, options = {}) {
588
728
  redacted: true
589
729
  };
590
730
  if (reveal === "none") {
591
- const parsed = _chunk7NIH5IL3cjs.RedactedItemGroupSchema.safeParse(result);
731
+ const parsed = _chunkFVLKIL6Wcjs.RedactedItemGroupSchema.safeParse(result);
592
732
  if (!parsed.success) {
593
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(
733
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(
594
734
  "item-group",
595
735
  parsed.error.issues.map((issue) => ({
596
736
  path: issue.path.map(String),
@@ -604,13 +744,13 @@ function redactItemGroup(group, options = {}) {
604
744
  }
605
745
  function assertRedactedItemGroup(data) {
606
746
  if (typeof data !== "object" || data === null) {
607
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)("item-group", [
747
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)("item-group", [
608
748
  { path: [], message: "Redacted item group must be an object.", code: "invalid_type" }
609
749
  ]);
610
750
  }
611
751
  const candidate = data;
612
752
  if (candidate.redacted !== true) {
613
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)("item-group", [
753
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)("item-group", [
614
754
  {
615
755
  path: ["redacted"],
616
756
  message: "Missing redacted marker \u2014 this payload is not a redactItemGroup() projection.",
@@ -618,9 +758,9 @@ function assertRedactedItemGroup(data) {
618
758
  }
619
759
  ]);
620
760
  }
621
- const parsed = _chunk7NIH5IL3cjs.RedactedItemGroupSchema.safeParse(candidate);
761
+ const parsed = _chunkFVLKIL6Wcjs.RedactedItemGroupSchema.safeParse(candidate);
622
762
  if (!parsed.success) {
623
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(
763
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(
624
764
  "item-group",
625
765
  parsed.error.issues.map((issue) => ({
626
766
  path: issue.path.map(String),
@@ -633,8 +773,8 @@ function assertRedactedItemGroup(data) {
633
773
  try {
634
774
  assertRedacted(item);
635
775
  } catch (error) {
636
- if (error instanceof _chunk5RE3ZRSAcjs.ActivitySchemaError) {
637
- throw new (0, _chunk5RE3ZRSAcjs.ActivitySchemaError)(
776
+ if (error instanceof _chunkFKH4YT5Xcjs.ActivitySchemaError) {
777
+ throw new (0, _chunkFKH4YT5Xcjs.ActivitySchemaError)(
638
778
  "item-group",
639
779
  error.errors.map((issue) => ({
640
780
  ...issue,
@@ -722,5 +862,15 @@ function assertRedactedItemGroup(data) {
722
862
 
723
863
 
724
864
 
725
- exports.ActivitySchemaError = _chunk5RE3ZRSAcjs.ActivitySchemaError; exports.BlankConfigSchema = _chunk5RE3ZRSAcjs.BlankConfigSchema; exports.DEFAULT_PASS_THRESHOLD = _chunkMVZKEWZNcjs.DEFAULT_PASS_THRESHOLD; exports.DeferredScoringError = _chunk5RE3ZRSAcjs.DeferredScoringError; exports.FeedbackSchema = _chunk5RE3ZRSAcjs.FeedbackSchema; exports.FillInTheBlanksDataSchema = _chunk5RE3ZRSAcjs.FillInTheBlanksDataSchema; exports.ItemGroupSchema = _chunk7NIH5IL3cjs.ItemGroupSchema; exports.MediaSchema = _chunk5RE3ZRSAcjs.MediaSchema; exports.MediaUrlSchema = _chunk5RE3ZRSAcjs.MediaUrlSchema; exports.MultipleChoiceDataSchema = _chunk5RE3ZRSAcjs.MultipleChoiceDataSchema; exports.MultipleChoiceOptionSchema = _chunk5RE3ZRSAcjs.MultipleChoiceOptionSchema; exports.RedactedBlankConfigSchema = _chunk5RE3ZRSAcjs.RedactedBlankConfigSchema; exports.RedactedFillInTheBlanksDataSchema = _chunk5RE3ZRSAcjs.RedactedFillInTheBlanksDataSchema; exports.RedactedItemGroupSchema = _chunk7NIH5IL3cjs.RedactedItemGroupSchema; exports.RedactedMultipleChoiceDataSchema = _chunk5RE3ZRSAcjs.RedactedMultipleChoiceDataSchema; exports.RedactedMultipleChoiceOptionSchema = _chunk5RE3ZRSAcjs.RedactedMultipleChoiceOptionSchema; exports.RedactedScoringError = _chunk5RE3ZRSAcjs.RedactedScoringError; exports.RedactedStimulusSchema = _chunk7NIH5IL3cjs.RedactedStimulusSchema; exports.RedactedWrittenResponseDataSchema = _chunk5RE3ZRSAcjs.RedactedWrittenResponseDataSchema; exports.StimulusSchema = _chunk7NIH5IL3cjs.StimulusSchema; exports.TextMatchPolicySchema = _chunk5RE3ZRSAcjs.TextMatchPolicySchema; exports.UnknownActivityTypeError = _chunk5RE3ZRSAcjs.UnknownActivityTypeError; exports.WrittenResponseDataSchema = _chunk5RE3ZRSAcjs.WrittenResponseDataSchema; exports.WrittenResponseRubricCriterionSchema = _chunk5RE3ZRSAcjs.WrittenResponseRubricCriterionSchema; exports.WrittenResponseRubricSchema = _chunk5RE3ZRSAcjs.WrittenResponseRubricSchema; exports.XAPIVerb = _chunkAFIQQADJcjs.XAPIVerb; exports.XAPI_VERB_DISPLAY = _chunkAFIQQADJcjs.XAPI_VERB_DISPLAY; exports.assertRedacted = assertRedacted; exports.assertRedactedItemGroup = assertRedactedItemGroup; exports.canonicalJson = canonicalJson; exports.classifyBand = _chunkMVZKEWZNcjs.classifyBand; exports.composeAssessmentScore = _chunkMVZKEWZNcjs.composeAssessmentScore; exports.computePassThreshold = _chunkMVZKEWZNcjs.computePassThreshold; exports.contentHash = contentHash; exports.countWords = _chunk5RE3ZRSAcjs.countWords; exports.defineActivityType = _chunk5RE3ZRSAcjs.defineActivityType; exports.diffResponses = diffResponses; exports.evaluate = _chunkMVZKEWZNcjs.evaluate; exports.fillInTheBlanksJsonSchema = _chunk7NIH5IL3cjs.fillInTheBlanksJsonSchema; exports.fillInTheBlanksType = _chunk5RE3ZRSAcjs.fillInTheBlanksType; exports.fingerprint = fingerprint; exports.flattenSequence = flattenSequence; exports.getActivityTypeDescriptor = _chunk5RE3ZRSAcjs.getActivityTypeDescriptor; exports.gradeFromRubric = _chunkMVZKEWZNcjs.gradeFromRubric; exports.gte = _chunkMVZKEWZNcjs.gte; exports.hasGrade = _chunkMVZKEWZNcjs.hasGrade; exports.hashSeed = hashSeed; exports.isItemGroup = isItemGroup; exports.itemGroupJsonSchema = _chunk7NIH5IL3cjs.itemGroupJsonSchema; exports.jsonSchemaFor = _chunk7NIH5IL3cjs.jsonSchemaFor; exports.levenshteinDistance = _chunk5RE3ZRSAcjs.levenshteinDistance; exports.matchText = _chunk5RE3ZRSAcjs.matchText; exports.multipleChoiceJsonSchema = _chunk7NIH5IL3cjs.multipleChoiceJsonSchema; exports.multipleChoiceType = _chunk5RE3ZRSAcjs.multipleChoiceType; exports.outcomeFromGrade = _chunkMVZKEWZNcjs.outcomeFromGrade; exports.planAttempt = planAttempt; exports.redact = redact; exports.redactItemGroup = redactItemGroup; exports.registerActivityType = _chunk5RE3ZRSAcjs.registerActivityType; exports.registeredActivityTypes = _chunk5RE3ZRSAcjs.registeredActivityTypes; exports.restoreAttemptState = restoreAttemptState; exports.roundGrade = _chunkMVZKEWZNcjs.roundGrade; exports.score = _chunkMVZKEWZNcjs.score; exports.scoredItemsFromPlan = scoredItemsFromPlan; exports.seededShuffle = seededShuffle; exports.serializeAttemptState = serializeAttemptState; exports.stimulusJsonSchema = _chunk7NIH5IL3cjs.stimulusJsonSchema; exports.validateActivity = _chunk7NIH5IL3cjs.validateActivity; exports.validateItemGroup = _chunk7NIH5IL3cjs.validateItemGroup; exports.validateXAPIStatement = _chunkAFIQQADJcjs.validateXAPIStatement; exports.verifyAttemptPlan = verifyAttemptPlan; exports.writtenResponseJsonSchema = _chunk7NIH5IL3cjs.writtenResponseJsonSchema; exports.writtenResponseType = _chunk5RE3ZRSAcjs.writtenResponseType; exports.xAPIBuilder = _chunkAFIQQADJcjs.xAPIBuilder; exports.xapiDefinitionFor = _chunkAFIQQADJcjs.xapiDefinitionFor;
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+ exports.ActivitySchemaError = _chunkFKH4YT5Xcjs.ActivitySchemaError; exports.BlankConfigSchema = _chunkFKH4YT5Xcjs.BlankConfigSchema; exports.DEFAULT_PASS_THRESHOLD = _chunkYJZY5TPYcjs.DEFAULT_PASS_THRESHOLD; exports.DeferredScoringError = _chunkFKH4YT5Xcjs.DeferredScoringError; exports.FeedbackSchema = _chunkFKH4YT5Xcjs.FeedbackSchema; exports.FillInTheBlanksDataSchema = _chunkFKH4YT5Xcjs.FillInTheBlanksDataSchema; exports.ItemGroupSchema = _chunkFVLKIL6Wcjs.ItemGroupSchema; exports.MediaPlaybackSchema = _chunkFKH4YT5Xcjs.MediaPlaybackSchema; exports.MediaSchema = _chunkFKH4YT5Xcjs.MediaSchema; exports.MediaUrlSchema = _chunkFKH4YT5Xcjs.MediaUrlSchema; exports.MultipleChoiceDataSchema = _chunkFKH4YT5Xcjs.MultipleChoiceDataSchema; exports.MultipleChoiceOptionSchema = _chunkFKH4YT5Xcjs.MultipleChoiceOptionSchema; exports.NativeControlHintSchema = _chunkFKH4YT5Xcjs.NativeControlHintSchema; exports.RedactedBlankConfigSchema = _chunkFKH4YT5Xcjs.RedactedBlankConfigSchema; exports.RedactedFillInTheBlanksDataSchema = _chunkFKH4YT5Xcjs.RedactedFillInTheBlanksDataSchema; exports.RedactedItemGroupSchema = _chunkFVLKIL6Wcjs.RedactedItemGroupSchema; exports.RedactedMediaSchema = _chunkFKH4YT5Xcjs.RedactedMediaSchema; exports.RedactedMultipleChoiceDataSchema = _chunkFKH4YT5Xcjs.RedactedMultipleChoiceDataSchema; exports.RedactedMultipleChoiceOptionSchema = _chunkFKH4YT5Xcjs.RedactedMultipleChoiceOptionSchema; exports.RedactedScoringError = _chunkFKH4YT5Xcjs.RedactedScoringError; exports.RedactedStimulusSchema = _chunkFVLKIL6Wcjs.RedactedStimulusSchema; exports.RedactedWrittenResponseDataSchema = _chunkFKH4YT5Xcjs.RedactedWrittenResponseDataSchema; exports.StimulusSchema = _chunkFVLKIL6Wcjs.StimulusSchema; exports.TextMatchPolicySchema = _chunkFKH4YT5Xcjs.TextMatchPolicySchema; exports.UnknownActivityTypeError = _chunkFKH4YT5Xcjs.UnknownActivityTypeError; exports.WrittenResponseDataSchema = _chunkFKH4YT5Xcjs.WrittenResponseDataSchema; exports.WrittenResponseRubricCriterionSchema = _chunkFKH4YT5Xcjs.WrittenResponseRubricCriterionSchema; exports.WrittenResponseRubricSchema = _chunkFKH4YT5Xcjs.WrittenResponseRubricSchema; exports.XAPIVerb = _chunk7ACNBDSFcjs.XAPIVerb; exports.XAPI_VERB_DISPLAY = _chunk7ACNBDSFcjs.XAPI_VERB_DISPLAY; exports.assertRedacted = assertRedacted; exports.assertRedactedItemGroup = assertRedactedItemGroup; exports.canonicalJson = canonicalJson; exports.classifyBand = _chunkYJZY5TPYcjs.classifyBand; exports.composeAssessmentScore = _chunkYJZY5TPYcjs.composeAssessmentScore; exports.computePassThreshold = _chunkYJZY5TPYcjs.computePassThreshold; exports.contentHash = contentHash; exports.countWords = _chunkFKH4YT5Xcjs.countWords; exports.defineActivityType = _chunkFKH4YT5Xcjs.defineActivityType; exports.diffResponses = diffResponses; exports.entryKeyOf = entryKeyOf; exports.evaluate = _chunkYJZY5TPYcjs.evaluate; exports.fillInTheBlanksJsonSchema = _chunkFVLKIL6Wcjs.fillInTheBlanksJsonSchema; exports.fillInTheBlanksType = _chunkFKH4YT5Xcjs.fillInTheBlanksType; exports.fingerprint = fingerprint; exports.flattenSequence = flattenSequence; exports.getActivityTypeDescriptor = _chunkFKH4YT5Xcjs.getActivityTypeDescriptor; exports.gradeFromRubric = _chunkYJZY5TPYcjs.gradeFromRubric; exports.gte = _chunkYJZY5TPYcjs.gte; exports.hasGrade = _chunkYJZY5TPYcjs.hasGrade; exports.hashSeed = hashSeed; exports.isItemGroup = isItemGroup; exports.itemGroupJsonSchema = _chunkFVLKIL6Wcjs.itemGroupJsonSchema; exports.jsonSchemaFor = _chunkFVLKIL6Wcjs.jsonSchemaFor; exports.levenshteinDistance = _chunkFKH4YT5Xcjs.levenshteinDistance; exports.matchText = _chunkFKH4YT5Xcjs.matchText; exports.multipleChoiceJsonSchema = _chunkFVLKIL6Wcjs.multipleChoiceJsonSchema; exports.multipleChoiceType = _chunkFKH4YT5Xcjs.multipleChoiceType; exports.outcomeFromGrade = _chunkYJZY5TPYcjs.outcomeFromGrade; exports.planAttempt = planAttempt; exports.planMediaBudgets = planMediaBudgets; exports.redact = redact; exports.redactItemGroup = redactItemGroup; exports.registerActivityType = _chunkFKH4YT5Xcjs.registerActivityType; exports.registeredActivityTypes = _chunkFKH4YT5Xcjs.registeredActivityTypes; exports.resolvePlaybackPolicy = resolvePlaybackPolicy; exports.restoreAttemptState = restoreAttemptState; exports.restoreMediaPlayLedger = restoreMediaPlayLedger; exports.roundGrade = _chunkYJZY5TPYcjs.roundGrade; exports.score = _chunkYJZY5TPYcjs.score; exports.scoredItemsFromPlan = scoredItemsFromPlan; exports.seededShuffle = seededShuffle; exports.serializeAttemptState = serializeAttemptState; exports.serializeMediaPlayLedger = serializeMediaPlayLedger; exports.slotMediaKey = slotMediaKey; exports.stimulusJsonSchema = _chunkFVLKIL6Wcjs.stimulusJsonSchema; exports.stimulusMediaKey = stimulusMediaKey; exports.validateActivity = _chunkFVLKIL6Wcjs.validateActivity; exports.validateItemGroup = _chunkFVLKIL6Wcjs.validateItemGroup; exports.validateXAPIStatement = _chunk7ACNBDSFcjs.validateXAPIStatement; exports.verifyAttemptPlan = verifyAttemptPlan; exports.writtenResponseJsonSchema = _chunkFVLKIL6Wcjs.writtenResponseJsonSchema; exports.writtenResponseType = _chunkFKH4YT5Xcjs.writtenResponseType; exports.xAPIBuilder = _chunk7ACNBDSFcjs.xAPIBuilder; exports.xapiDefinitionFor = _chunk7ACNBDSFcjs.xapiDefinitionFor;
726
876
  //# sourceMappingURL=index.cjs.map