@thanh01.pmt/curriculum-kit 1.4.47 → 1.4.49

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.mjs CHANGED
@@ -4007,7 +4007,25 @@ var PlanningNodeSchema = z.object({
4007
4007
  file: z.string(),
4008
4008
  evidence: z.string().default("")
4009
4009
  })).default([]),
4010
- phase_id: z.string().default("")
4010
+ phase_id: z.string().default(""),
4011
+ // P52/T2.1: tangible user-visible outcome projected from the graph step
4012
+ // (checkpoint candidate for session cutting). Empty = not a checkpoint.
4013
+ user_visible_deliverable: z.string().default(""),
4014
+ // P52/T3.1 — depth-reconcile inputs (mirrored from the feed; optional so
4015
+ // raw graphs without variants keep planning unchanged):
4016
+ // • depth_variants: minutes to teach this node at each depth level (ULO ≤
4017
+ // CIO ≤ SIO) — the reconciler's price list for downgrades.
4018
+ // • depth_scaffold_candidates: parallel to scaffold_candidates but acting
4019
+ // on DEPTH (SIO→CIO, CIO→ULO) instead of lesson time.
4020
+ // • is_core: Master-Tree core concept — never downgraded; escalate instead.
4021
+ depth_variants: z.object({ ulo: z.number().int().nonnegative(), cio: z.number().int().nonnegative(), sio: z.number().int().nonnegative() }).optional(),
4022
+ depth_scaffold_candidates: z.array(z.object({
4023
+ from_depth: DepthLevelSchema,
4024
+ to_depth: DepthLevelSchema,
4025
+ minutes_saved: z.number().int().nonnegative(),
4026
+ reason: z.string().default("")
4027
+ })).optional(),
4028
+ is_core: z.boolean().default(false)
4011
4029
  });
4012
4030
  var DependencyEdgeSchema = z.object({
4013
4031
  from: z.string(),
@@ -4845,9 +4863,9 @@ Evaluate the candidate artifact across these 6 dimensions:
4845
4863
  - 0 pts: Missing critical sections.
4846
4864
 
4847
4865
  5. **Technical & Conceptual Accuracy (15 pts):**
4848
- - 15 pts: Code snippets, logic flows, architectural descriptions, and Mermaid diagrams are conceptually sound and valid. If \`canonicalExposition\` or \`[KNOWLEDGE_EXPOSITION]\` is provided, content strictly adheres to canonical concepts without contradicting definitions or examples.
4866
+ - 15 pts: Code snippets, logic flows, architectural descriptions, and Mermaid diagrams are conceptually sound and valid. Every code identifier uses the REAL standard-library/API spelling of the declared stack (grounded in REFERENCE_PACK / canonical LESSON) \u2014 internal consistency with a glossary term name is NOT evidence of correctness. If \`canonicalExposition\` or \`[KNOWLEDGE_EXPOSITION]\` is provided, content strictly adheres to canonical concepts without contradicting definitions or examples.
4849
4867
  - 8 pts: Minor syntax inaccuracies or unidiomatic code that does not break core concepts.
4850
- - 0 pts: Severe technical hallucinations, broken logic, invalid diagrams, or direct contradiction of canonical exposition knowledge.
4868
+ - 0 pts: Severe technical hallucinations, broken logic, invalid diagrams, invented casing/spelling rules for standard-library identifiers, or direct contradiction of canonical exposition knowledge.
4851
4869
 
4852
4870
  6. **Contract Consistency & Zero-Drift (10 pts):**
4853
4871
  - 10 pts: Satellite artifact strictly adheres to the scope, tech stack, and objectives of Lesson ${lessonId} without introducing unrelated topics. If \`canonicalLessonExcerpt\` is present in candidate JSON, all satellite phases/activities strictly operationalize the master Lesson Flow and Activity Sequence without inventing divergent timelines.
@@ -5424,6 +5442,7 @@ var MAX_NEW_CONCEPTS_PER_SESSION_K12 = 2;
5424
5442
  var MAX_NEW_CONCEPTS_PER_SESSION_ADULT = 3;
5425
5443
  var DEFAULT_OVERHEAD_RATIO = 0.15;
5426
5444
  var MAX_IN_SESSION_SETUP_MINUTES = 15;
5445
+ var SESSION_CUT_TOLERANCE = 0.15;
5427
5446
  var ENVIRONMENT_PROVISIONING_MODELS = [
5428
5447
  "PRE_INSTALLED_LAB",
5429
5448
  "CLOUD_MANAGED",
@@ -10177,6 +10196,38 @@ function checkScopeDrift(content, scopedKeywords, tolerance = 0) {
10177
10196
  evidence: drift
10178
10197
  };
10179
10198
  }
10199
+ function checkIdentifierCasing(content, refPack) {
10200
+ if (!refPack || !refPack.trim()) return null;
10201
+ const canonical = /* @__PURE__ */ new Map();
10202
+ const remember = (id) => {
10203
+ if (id.length < 2) return;
10204
+ const key = id.toLowerCase().replace(/_/g, "");
10205
+ if (!canonical.has(key)) canonical.set(key, id);
10206
+ };
10207
+ for (const m of refPack.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)\s*\(/g)) remember(m[1]);
10208
+ for (const m of refPack.matchAll(/\b([A-Za-z_][A-Za-z0-9_]*)\s*\(/g)) remember(m[1]);
10209
+ for (const m of refPack.matchAll(/`([A-Za-z_][A-Za-z0-9_]*)`/g)) remember(m[1]);
10210
+ if (canonical.size === 0) return null;
10211
+ const RESERVED = /* @__PURE__ */ new Set(["if", "for", "while", "switch", "func", "return", "guard", "catch", "else", "in"]);
10212
+ const violations = [];
10213
+ const fenceRe = /```[a-zA-Z]*\n([\s\S]*?)```/g;
10214
+ for (const fence of content.matchAll(fenceRe)) {
10215
+ for (const m of fence[1].matchAll(/\b([A-Za-z_][A-Za-z0-9_]*)\s*\(/g)) {
10216
+ const tok = m[1];
10217
+ if (RESERVED.has(tok.toLowerCase())) continue;
10218
+ const real = canonical.get(tok.toLowerCase().replace(/_/g, ""));
10219
+ if (real && real !== tok && !violations.includes(`${tok} \u2192 ${real}`)) {
10220
+ violations.push(`${tok} \u2192 ${real}`);
10221
+ }
10222
+ }
10223
+ }
10224
+ if (violations.length === 0) return null;
10225
+ return {
10226
+ code: "identifier-casing",
10227
+ detail: `Code d\xF9ng identifier l\u1EC7ch casing so v\u1EDBi REFERENCE_PACK (ngu\u1ED3n s\u1EF1 th\u1EADt k\u1EF9 thu\u1EADt): ${violations.join(", ")}. Identifier trong code PH\u1EA2I copy nguy\xEAn d\u1EA1ng t\u1EEB REFERENCE_PACK \u2014 KH\xD4NG suy ra casing t\u1EEB t\xEAn keyword/concept (ch\xFAng l\xE0 nh\xE3n s\u01B0 ph\u1EA1m, kh\xF4ng ph\u1EA3i API).`,
10228
+ evidence: violations.slice(0, 5)
10229
+ };
10230
+ }
10180
10231
  function validateArtifactDeterministic(input) {
10181
10232
  const issues = [];
10182
10233
  const cjk = scanCjkLeaks(input.content);
@@ -10184,6 +10235,8 @@ function validateArtifactDeterministic(input) {
10184
10235
  if (input.refPack) {
10185
10236
  const ver = checkVersionGroundTruth(input.content, input.refPack);
10186
10237
  if (ver) issues.push(ver);
10238
+ const casing = checkIdentifierCasing(input.content, input.refPack);
10239
+ if (casing) issues.push(casing);
10187
10240
  }
10188
10241
  if (input.scopedKeywords && input.scopedKeywords.length > 0) {
10189
10242
  const scope = checkScopeDrift(input.content, input.scopedKeywords);
@@ -10295,9 +10348,10 @@ function buildSystemPrompt(targetLanguage = "vi", techStack, hardwarePlatform) {
10295
10348
  "Rules:",
10296
10349
  "1. Cover EXACTLY the scoped keywords and concepts \u2014 nothing beyond the session scope.",
10297
10350
  "2. Every Key Term definition must be consistent with the glossary entry provided.",
10298
- "3. Respect each concept depth target (ULO/CIO/SIO) \u2014 do not overshoot.",
10299
- "4. Student-facing only: no teacher instructions, no classroom management text.",
10300
- "5. Output the full markdown document following the provided section skeleton exactly (headers and placeholders preserved).",
10351
+ '3. IDENTIFIER GROUND TRUTH: glossary/keyword names are pedagogical concept labels \u2014 NEVER derive code identifier casing or spelling from them. In code samples, copy identifiers EXACTLY from the REFERENCE_PACK ground truth (e.g. the standard library function is `print` lowercase; "Print" as a topic label is not an API symbol).',
10352
+ "4. Respect each concept depth target (ULO/CIO/SIO) \u2014 do not overshoot.",
10353
+ "5. Student-facing only: no teacher instructions, no classroom management text.",
10354
+ "6. Output the full markdown document following the provided section skeleton exactly (headers and placeholders preserved).",
10301
10355
  domainGuardrails,
10302
10356
  langDirective
10303
10357
  ].join("\n");
@@ -10535,6 +10589,98 @@ async function ensureExpositionForLesson(storage, projectId, lessonCode, options
10535
10589
  return { relPath: result.relPath, context: buildExpositionContext(result.content), reused: result.reused, rawContent: result.content };
10536
10590
  }
10537
10591
  init_errors();
10592
+
10593
+ // src/services/depthReconciler.ts
10594
+ function tierOf(node, isLeaf) {
10595
+ if (node.phase_id !== "" && /__ADV\d{2}$/.test(node.id)) return 1;
10596
+ const depth = node.depth_hint ?? "cio";
10597
+ if (depth === "sio") return isLeaf ? 2 : 3;
10598
+ if (depth === "cio") return isLeaf ? 4 : 5;
10599
+ return -1;
10600
+ }
10601
+ function classifyDepthCandidates(nodes, edges) {
10602
+ const baseConcept = (id) => id.replace(/__(ADV|PREV)\d{2}$/, "");
10603
+ const conceptIds = new Set(nodes.filter((n) => n.kind === "concept").map((n) => baseConcept(n.id)));
10604
+ const hasDependent = /* @__PURE__ */ new Set();
10605
+ for (const e of edges) {
10606
+ if (e.kind !== "knowledge") continue;
10607
+ const from = baseConcept(e.from);
10608
+ const to = baseConcept(e.to);
10609
+ if (conceptIds.has(from) && conceptIds.has(to)) hasDependent.add(from);
10610
+ }
10611
+ const isLeaf = /* @__PURE__ */ new Map();
10612
+ for (const n of nodes) {
10613
+ if (n.kind !== "concept") continue;
10614
+ const base = baseConcept(n.id);
10615
+ if (!isLeaf.has(base)) isLeaf.set(base, !hasDependent.has(base));
10616
+ }
10617
+ return isLeaf;
10618
+ }
10619
+ function reconcilePlanDepth(nodes, edges, spec, budgetMinutes) {
10620
+ const MAX_ROUNDS = 5;
10621
+ const total = () => nodes.reduce((acc, n) => acc + n.estimated_minutes, 0);
10622
+ const isLeaf = classifyDepthCandidates(nodes, edges);
10623
+ const baseConcept = (id) => id.replace(/__(ADV|PREV)\d{2}$/, "");
10624
+ const applied = [];
10625
+ const mutated = /* @__PURE__ */ new Set();
10626
+ let rounds = 0;
10627
+ while (total() > budgetMinutes && rounds < MAX_ROUNDS) {
10628
+ rounds++;
10629
+ let overBy = total() - budgetMinutes;
10630
+ const candidates = [];
10631
+ for (let i = 0; i < nodes.length; i++) {
10632
+ const n = nodes[i];
10633
+ if (n.kind !== "concept") continue;
10634
+ if (n.is_core) continue;
10635
+ if (n.depth_hint == null) continue;
10636
+ const base = baseConcept(n.id);
10637
+ const leaf = isLeaf.get(base) ?? true;
10638
+ const tier = tierOf(n, leaf);
10639
+ if (tier < 0) continue;
10640
+ const depth = n.depth_hint ?? "cio";
10641
+ const toDepth = depth === "sio" ? "cio" : "ulo";
10642
+ const variants = n.depth_variants;
10643
+ const target = variants ? variants[toDepth] : Math.max(5, Math.round(n.estimated_minutes * 0.6));
10644
+ const saved = n.estimated_minutes - target;
10645
+ if (saved <= 0) continue;
10646
+ candidates.push({
10647
+ nodeId: n.id,
10648
+ fromDepth: depth,
10649
+ toDepth,
10650
+ minutesSaved: saved,
10651
+ reason: n.depth_scaffold_candidates?.find((c) => c.to_depth === toDepth)?.reason ?? `depth downgrade ${depth}\u2192${toDepth} (tier ${tier}${leaf ? ", leaf" : ""})`,
10652
+ node: n,
10653
+ tier,
10654
+ index: i
10655
+ });
10656
+ }
10657
+ if (candidates.length === 0) break;
10658
+ candidates.sort((a, b) => a.tier - b.tier || b.minutesSaved - a.minutesSaved);
10659
+ for (const c of candidates) {
10660
+ if (overBy <= 0) break;
10661
+ const n = c.node;
10662
+ const target = n.depth_variants ? n.depth_variants[c.toDepth] : Math.max(5, Math.round(n.estimated_minutes * 0.6));
10663
+ const saved = n.estimated_minutes - target;
10664
+ if (saved <= 0) continue;
10665
+ n.estimated_minutes = target;
10666
+ n.depth_hint = c.toDepth;
10667
+ applied.push({ nodeId: n.id, fromDepth: c.fromDepth, toDepth: c.toDepth, minutesSaved: saved, reason: c.reason });
10668
+ mutated.add(n.id);
10669
+ overBy -= saved;
10670
+ }
10671
+ }
10672
+ const finalTotal = total();
10673
+ const deficitMinutes = Math.max(0, finalTotal - budgetMinutes);
10674
+ return {
10675
+ unchanged: applied.length === 0,
10676
+ applied,
10677
+ mutatedNodeIds: [...mutated],
10678
+ escalate: deficitMinutes > 0,
10679
+ deficitMinutes
10680
+ };
10681
+ }
10682
+
10683
+ // src/services/curriculumPlannerService.ts
10538
10684
  var asArr = (v) => Array.isArray(v) ? v : [];
10539
10685
  var asStr = (v, dflt = "") => typeof v === "string" ? v : dflt;
10540
10686
  var asNum = (v, dflt) => typeof v === "number" && Number.isFinite(v) ? v : dflt;
@@ -10574,7 +10720,20 @@ function normalizePlanningGraph(raw) {
10574
10720
  suggest: asStr(c.suggest, "provide_full")
10575
10721
  })),
10576
10722
  references: asArr(n.references).map((ref) => ({ file: asStr(ref.file), evidence: asStr(ref.evidence) })).filter((ref) => ref.file),
10577
- phase_id: asStr(n.phase_id)
10723
+ phase_id: asStr(n.phase_id),
10724
+ user_visible_deliverable: asStr(n.user_visible_deliverable),
10725
+ depth_variants: (() => {
10726
+ const dv = n.depth_variants;
10727
+ if (!dv) return void 0;
10728
+ return { ulo: Math.max(0, Math.round(asNum(dv.ulo, 0))), cio: Math.max(0, Math.round(asNum(dv.cio, 0))), sio: Math.max(0, Math.round(asNum(dv.sio, 0))) };
10729
+ })(),
10730
+ depth_scaffold_candidates: asArr(n.depth_scaffold_candidates).map((c) => ({
10731
+ from_depth: asStr(c.from_depth, "sio"),
10732
+ to_depth: asStr(c.to_depth, "cio"),
10733
+ minutes_saved: Math.max(0, Math.round(asNum(c.minutes_saved, 0))),
10734
+ reason: asStr(c.reason)
10735
+ })),
10736
+ is_core: n.is_core === true
10578
10737
  });
10579
10738
  }
10580
10739
  for (const e of asArr(r.dependency_edges)) {
@@ -10618,7 +10777,9 @@ function normalizePlanningGraph(raw) {
10618
10777
  completion_level: "standard",
10619
10778
  scaffold_candidates: [],
10620
10779
  references: [],
10621
- phase_id: ""
10780
+ phase_id: "",
10781
+ user_visible_deliverable: "",
10782
+ is_core: false
10622
10783
  });
10623
10784
  for (const p of asStrArr(c.prerequisites)) {
10624
10785
  edges.push({ from: p, to: asStr(c.id), kind: "knowledge", reason: "concept prerequisite" });
@@ -10655,7 +10816,9 @@ function normalizePlanningGraph(raw) {
10655
10816
  completion_level: "standard",
10656
10817
  scaffold_candidates: [],
10657
10818
  references: [],
10658
- phase_id: ""
10819
+ phase_id: "",
10820
+ user_visible_deliverable: "",
10821
+ is_core: false
10659
10822
  });
10660
10823
  if (prev) edges.push({ from: prev, to: id, kind: "task", reason: "roadmap sequence" });
10661
10824
  prev = id;
@@ -10691,13 +10854,15 @@ function normalizePlanningGraph(raw) {
10691
10854
  completion_level: "standard",
10692
10855
  scaffold_candidates: [],
10693
10856
  references: [],
10694
- phase_id: ""
10857
+ phase_id: "",
10858
+ user_visible_deliverable: "",
10859
+ is_core: false
10695
10860
  });
10696
10861
  if (prev) edges.push({ from: prev, to: id, kind: "task", reason: "feature build order" });
10697
10862
  prev = id;
10698
10863
  }
10699
10864
  if (stepCount === 0 && fid) {
10700
- nodes.push({ id: fid, kind: "skill", name: asStr(f.name, fid), concept_codes: [], keywords: [], new_keywords: [], prerequisite_keywords: [], estimated_minutes: 45, bloom_hint: "Apply", depth_hint: null, completion_level: "standard", scaffold_candidates: [], references: [], phase_id: "" });
10865
+ nodes.push({ id: fid, kind: "skill", name: asStr(f.name, fid), concept_codes: [], keywords: [], new_keywords: [], prerequisite_keywords: [], estimated_minutes: 45, bloom_hint: "Apply", depth_hint: null, completion_level: "standard", scaffold_candidates: [], references: [], phase_id: "", user_visible_deliverable: "", is_core: false });
10701
10866
  }
10702
10867
  }
10703
10868
  }
@@ -10859,6 +11024,39 @@ function computePackingSpec(constraints) {
10859
11024
  sessionDurationMinutes: constraints.session_duration_minutes
10860
11025
  };
10861
11026
  }
11027
+ var filledOf = (s) => s.knowledgeMinutes + s.practiceMinutes;
11028
+ function cutBackToCheckpoint(current, nodeById, spec, warnings) {
11029
+ const budget = spec.contentBudget;
11030
+ const minFill = budget * (1 - SESSION_CUT_TOLERANCE);
11031
+ const hasPartAfter = new Array(current.entries.length).fill(false);
11032
+ let seenPart = false;
11033
+ for (let i = current.entries.length - 1; i >= 0; i--) {
11034
+ hasPartAfter[i] = seenPart;
11035
+ if (current.entries[i].totalParts > 1) seenPart = true;
11036
+ }
11037
+ let bestIdx = -1;
11038
+ let cumulative = 0;
11039
+ for (let i = 0; i < current.entries.length; i++) {
11040
+ const e = current.entries[i];
11041
+ cumulative += e.minutes;
11042
+ if (hasPartAfter[i] || e.totalParts > 1) continue;
11043
+ const n = nodeById.get(e.id);
11044
+ if (!n || n.user_visible_deliverable.trim().length === 0) continue;
11045
+ if (cumulative > budget || cumulative < minFill) continue;
11046
+ bestIdx = i;
11047
+ }
11048
+ if (bestIdx < 0) {
11049
+ warnings.push("no-checkpoint-within-tolerance: session cut at " + filledOf(current) + "m without a user-visible deliverable");
11050
+ return [];
11051
+ }
11052
+ const displacedEntries = current.entries.splice(bestIdx + 1);
11053
+ for (const e of displacedEntries) {
11054
+ if (nodeById.get(e.id)?.kind === "concept") current.knowledgeMinutes -= e.minutes;
11055
+ else current.practiceMinutes -= e.minutes;
11056
+ }
11057
+ current.nodeIds = current.entries.map((e) => e.id);
11058
+ return displacedEntries.map((e) => nodeById.get(e.id)).filter((n) => n != null);
11059
+ }
10862
11060
  function packUnitSessions(group, nodeById, spec, warnings) {
10863
11061
  const sessions = [];
10864
11062
  const fresh = () => ({ groupId: group.key, nodeIds: [], entries: [], knowledgeMinutes: 0, practiceMinutes: 0, oversized: false });
@@ -10868,7 +11066,9 @@ function packUnitSessions(group, nodeById, spec, warnings) {
10868
11066
  current = fresh();
10869
11067
  };
10870
11068
  const filled = () => current.knowledgeMinutes + current.practiceMinutes;
10871
- for (const id of group.orderedIds) {
11069
+ const ids = [...group.orderedIds];
11070
+ while (ids.length > 0) {
11071
+ const id = ids.shift();
10872
11072
  const node = nodeById.get(id);
10873
11073
  const isKnowledge = node.kind === "concept";
10874
11074
  if (node.estimated_minutes > spec.contentBudget) {
@@ -10904,7 +11104,16 @@ function packUnitSessions(group, nodeById, spec, warnings) {
10904
11104
  continue;
10905
11105
  }
10906
11106
  const minutes = node.estimated_minutes;
10907
- if (current.entries.length > 0 && filled() + minutes > spec.contentBudget) flush();
11107
+ if (current.entries.length > 0 && filled() + minutes > spec.contentBudget) {
11108
+ const displaced = cutBackToCheckpoint(current, nodeById, spec, warnings);
11109
+ if (displaced.length > 0) {
11110
+ ids.unshift(id);
11111
+ for (let di = displaced.length - 1; di >= 0; di--) ids.unshift(displaced[di].id);
11112
+ flush();
11113
+ continue;
11114
+ }
11115
+ flush();
11116
+ }
10908
11117
  if (isKnowledge) current.knowledgeMinutes += minutes;
10909
11118
  else current.practiceMinutes += minutes;
10910
11119
  current.entries.push({ id, minutes, part: 1, totalParts: 1 });
@@ -11214,6 +11423,19 @@ async function buildCurriculumPlan(rawGraph, options) {
11214
11423
  const graph = normalizePlanningGraph(rawGraph);
11215
11424
  warnings.push(...graph.warnings);
11216
11425
  assertAcyclic(graph.nodes, graph.edges);
11426
+ let reconcileSummary = null;
11427
+ if (typeof constraints.total_sessions === "number" && constraints.total_sessions > 0) {
11428
+ const spec0 = computePackingSpec(constraints);
11429
+ const budgetMinutes = constraints.total_sessions * spec0.contentBudget;
11430
+ reconcileSummary = reconcilePlanDepth(graph.nodes, graph.edges, spec0, budgetMinutes);
11431
+ if (!reconcileSummary.unchanged) {
11432
+ const saved = reconcileSummary.applied.reduce((a, x) => a + x.minutesSaved, 0);
11433
+ warnings.push(`depth reconcile: ${reconcileSummary.applied.length} downgrade(s), saved ${saved}m across ${reconcileSummary.mutatedNodeIds.length} node(s)`);
11434
+ }
11435
+ if (reconcileSummary.escalate) {
11436
+ warnings.push(`budget_escalation: deficit ${reconcileSummary.deficitMinutes}m after exhausting non-core depth candidates (budget ${constraints.total_sessions * computePackingSpec(constraints).contentBudget}m) \u2014 human review required`);
11437
+ }
11438
+ }
11217
11439
  const orderedIds = topoSort(graph.nodes, graph.edges);
11218
11440
  const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
11219
11441
  const spec = computePackingSpec(constraints);
@@ -27157,6 +27379,7 @@ Your task is to author a canonical, publication-grade learning artifact of type
27157
27379
  ${langDirective}
27158
27380
  ${headingDirective}
27159
27381
  2. NON-MOCK CODE INVARIANT: Any code snippet provided MUST be 100% syntactically valid, idiomatic, and executable without placeholders or fake functions.
27382
+ 2b. IDENTIFIER GROUND TRUTH: Never derive identifier casing/spelling from glossary term or concept names (they are pedagogical labels). Copy identifiers EXACTLY from the canonical LESSON and REFERENCE_PACK ground truth present in the context.
27160
27383
  3. PEDAGOGICAL GROUNDING: Strictly align with the ${pedagogy.toUpperCase()} model, Bloom's Revised Taxonomy, and IEEE/ACM CS2023 guidelines.
27161
27384
  4. SCAFFOLDING LEVEL: "${scaffoldingLevel.toUpperCase()}".${scaffoldingRule}
27162
27385
  5. TARGET AUDIENCE: ${gradeLevel ? `Grade ${gradeLevel}, ` : ""}${targetAge} on ${hwStr}.${deviceRule}${classDynamicsRule}${extraContextRule}
@@ -31514,6 +31737,6 @@ function renderMediaPlaceholder(entry) {
31514
31737
  return `> \u{1F5BC}\uFE0F [\u1EA2nh \u0111ang ch\u1EDD: ${entry.name} \u2014 s\u1EBD \u0111\u01B0\u1EE3c t\u1EA1o sau khi duy\u1EC7t media]`;
31515
31738
  }
31516
31739
 
31517
- export { ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActionableRepairActionSchema, ActionableRepairPromptSchema, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BLOOM_ACTION_VERBS, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, ConceptPrerequisiteEdgeSchema, ConceptSpiralEncounterSchema, ConstructiveAlignmentEvaluator, CoreConceptSchema, CourseObjectiveSchema, CoverageReportSchema, CrossArtifactDriftEvaluator, CurriculumArtifactSchema, CurriculumError, CurriculumPlanSchema, CurriculumQualityReportSchema, DEFAULT_ARTIFACT_STREAM_IDLE_MS, DEFAULT_ARTIFACT_STREAM_TOTAL_MS, DEFAULT_ENABLED_PROVIDERS, DEFAULT_GATE_SETTINGS, DEFAULT_KX_PRIORITIES, DEFAULT_LESSON_PRIORITIES, DEFAULT_OVERHEAD_RATIO, DEFAULT_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, ENVIRONMENT_PROVISIONING_MODELS, EXPOSITION_REL, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GeneratedSlideArraySchema, GeneratedSlideSchema, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HandoutSchema, HandoutSectionSchema, HybridBlueprintArraySchema, HybridBlueprintItemSchema, HybridDeckSlideArraySchema, HybridDeckSlideSchema, HybridPipelineError, InstructionSectionSchema, InstructionStepSchema, JUDGE_AUTO_APPROVE_THRESHOLD, JUDGE_ESCALATE_THRESHOLD, JudgeCriterionSchema, LAYER_IDLE_BUDGET_MS, LAYER_TOTAL_BUDGET_MS, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonEntitySchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MAX_AUTONOMOUS_REPAIR_TURNS, MAX_IN_SESSION_SETUP_MINUTES, MAX_NEW_CONCEPTS_PER_SESSION_ADULT, MAX_NEW_CONCEPTS_PER_SESSION_K12, MacroPedagogyPlanAuditSchema, MappingKindSchema, MarpSlideSchema, MasteryGateSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphAuditSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QualityAuditVerdictSchema, QuizOptionSchema, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SATELLITE_LESSON_PRIORITIES, SLIDE_CANONICAL_METHODOLOGY, STANDARD_REF_REGEX, STANDARD_SOT_FILES, STUDENT_FRICTION_MULTIPLIER, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SessionZpdStatusSchema, SilverTierSchema, SlideBlueprintArraySchema, SlideBlueprintItemSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WalkingSkeletonSchema, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, ZpdVerdictSchema, activityTools, analystTools, analyzeProjectCreationIntent, assembleTranslatedTemplate, assertAcyclic, assessorTools, assignDepths, atomicWriteFileSync, auditCurriculumPlanFlow, auditCurriculumQualityFlow, auditProjectGraphFlow, auditQualityReport, buildActivityPrompt, buildArtifactPrompt, buildCodeLabPrompt, buildConceptPrerequisites, buildCurriculumContext, buildCurriculumPlan, buildCurriculumPlanJudgePrompt, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildDomainLexiconGuardrail, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonEntityJson, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildMasteryGates, buildProjectGraphJudgePrompt, buildProjectInstructionPrompt, buildSatelliteContext, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWalkingSkeleton, buildWorksheetPrompt, checkSessionZpd, closeTruncatedJson, computeConceptSpiralProgression, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, dropCyclicConceptEdges, emitUsage, ensureExpositionForLesson, ensureKnowledgeExposition, entityRowAssignedTo, evaluateActivityAlignment, evaluateStandardsCoverage, executeCurriculumCommand, executeSlideProductionWorkflow, exportAllProjectQuizzes, expositionCacheKey, extractActivityContractRows, extractAssessmentMap, extractConditionalSections, extractCurriculumHorizon, extractDeclaredLanguage, extractEchoSections, extractJsonArray, extractRequiredSections, extractScopeSequenceRows, extractSectionHeadings, extractSessionSlice, extractStandardRefs, extractStreamChunk, extractSymbolLedger, extractThoughtAndContent, extractTieredScaffoldingBlock, findStandardStatement, formatQuizzesToCsv, fulfillMediaLedger, gateModeFor, generateActivityFlow, generateCodeLabFlow, generateDiagnosticQuizFlow, generateEducationalImage, generateExtensionFlow, generateHandoutFlow, generateLessonMasterFlow, generateMilestoneCurriculumBundle, generatePhase1SotArtifacts, generatePhase2SotArtifacts, generateProjectInstruction, generateProjectInstructionFlow, generateRoadmapCurriculum, generateSelfLabFlow, generateSelfPacedBundle, generateSingleArtifact, generateSlidesFlow, generateTeacherGuideFlow, generateWorksheetFlow, getAIModel, getArtifactMetadata, getDesignatedFallbackChain, getDesignatedFallbackConfig, getLessonMetadata, getProjectArtifactScope, getProjectStatusReport, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isActivityAlignmentLogOnly, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadAuthoringTemplate, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, packagerTools, parseAllSessions, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, renderAssignedRowsTable, renderEntitySlotsForType, renderFrameworkFromPlan, renderHorizonPromptBlock, renderMediaPlaceholder, researcherTools, resolveApiKey, resolveArtifactTemplate, resolveGateSettings, resolveStandardsPacks, resolveStreamBudget, resolveTargetLanguageCode, resolveTranslationTargets, reviewerTools, runCurriculumAIInference, safeParseJson, searchEducationalImages, searchEducationalVideos, selectStatementsForLesson, serializeActivityToMarkdown, serializeCodeLabToMarkdown, serializeDiagnosticQuizToMarkdown, serializeHandoutToMarkdown, serializeLessonToMarkdown, serializeProjectInstructionToMarkdown, serializeSelfLabToMarkdown, slugifyProjectName, streamCurriculumAIInference, streamCurriculumAIInferenceWithTools, streamDiagnosticQuizFlow, streamLLMWithFallback, streamLayerPrefillWithFallback, streamLessonMasterFlow, streamSelfLabFlow, stripHeadingKey, stripLlmJsonWrappers, stripTemplateFrontmatter, targetLanguageDisplayName, techSmeTools, topoSort, translateTemplate, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateHorizonCompliance, validateHybridDeckSlides, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
31740
+ export { ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActionableRepairActionSchema, ActionableRepairPromptSchema, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BLOOM_ACTION_VERBS, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, ConceptPrerequisiteEdgeSchema, ConceptSpiralEncounterSchema, ConstructiveAlignmentEvaluator, CoreConceptSchema, CourseObjectiveSchema, CoverageReportSchema, CrossArtifactDriftEvaluator, CurriculumArtifactSchema, CurriculumError, CurriculumPlanSchema, CurriculumQualityReportSchema, DEFAULT_ARTIFACT_STREAM_IDLE_MS, DEFAULT_ARTIFACT_STREAM_TOTAL_MS, DEFAULT_ENABLED_PROVIDERS, DEFAULT_GATE_SETTINGS, DEFAULT_KX_PRIORITIES, DEFAULT_LESSON_PRIORITIES, DEFAULT_OVERHEAD_RATIO, DEFAULT_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, ENVIRONMENT_PROVISIONING_MODELS, EXPOSITION_REL, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GeneratedSlideArraySchema, GeneratedSlideSchema, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HandoutSchema, HandoutSectionSchema, HybridBlueprintArraySchema, HybridBlueprintItemSchema, HybridDeckSlideArraySchema, HybridDeckSlideSchema, HybridPipelineError, InstructionSectionSchema, InstructionStepSchema, JUDGE_AUTO_APPROVE_THRESHOLD, JUDGE_ESCALATE_THRESHOLD, JudgeCriterionSchema, LAYER_IDLE_BUDGET_MS, LAYER_TOTAL_BUDGET_MS, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonEntitySchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MAX_AUTONOMOUS_REPAIR_TURNS, MAX_IN_SESSION_SETUP_MINUTES, MAX_NEW_CONCEPTS_PER_SESSION_ADULT, MAX_NEW_CONCEPTS_PER_SESSION_K12, MacroPedagogyPlanAuditSchema, MappingKindSchema, MarpSlideSchema, MasteryGateSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphAuditSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QualityAuditVerdictSchema, QuizOptionSchema, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SATELLITE_LESSON_PRIORITIES, SESSION_CUT_TOLERANCE, SLIDE_CANONICAL_METHODOLOGY, STANDARD_REF_REGEX, STANDARD_SOT_FILES, STUDENT_FRICTION_MULTIPLIER, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SessionZpdStatusSchema, SilverTierSchema, SlideBlueprintArraySchema, SlideBlueprintItemSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WalkingSkeletonSchema, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, ZpdVerdictSchema, activityTools, analystTools, analyzeProjectCreationIntent, assembleTranslatedTemplate, assertAcyclic, assessorTools, assignDepths, atomicWriteFileSync, auditCurriculumPlanFlow, auditCurriculumQualityFlow, auditProjectGraphFlow, auditQualityReport, buildActivityPrompt, buildArtifactPrompt, buildCodeLabPrompt, buildConceptPrerequisites, buildCurriculumContext, buildCurriculumPlan, buildCurriculumPlanJudgePrompt, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildDomainLexiconGuardrail, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonEntityJson, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildMasteryGates, buildProjectGraphJudgePrompt, buildProjectInstructionPrompt, buildSatelliteContext, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWalkingSkeleton, buildWorksheetPrompt, checkSessionZpd, classifyDepthCandidates, closeTruncatedJson, computeConceptSpiralProgression, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, dropCyclicConceptEdges, emitUsage, ensureExpositionForLesson, ensureKnowledgeExposition, entityRowAssignedTo, evaluateActivityAlignment, evaluateStandardsCoverage, executeCurriculumCommand, executeSlideProductionWorkflow, exportAllProjectQuizzes, expositionCacheKey, extractActivityContractRows, extractAssessmentMap, extractConditionalSections, extractCurriculumHorizon, extractDeclaredLanguage, extractEchoSections, extractJsonArray, extractRequiredSections, extractScopeSequenceRows, extractSectionHeadings, extractSessionSlice, extractStandardRefs, extractStreamChunk, extractSymbolLedger, extractThoughtAndContent, extractTieredScaffoldingBlock, findStandardStatement, formatQuizzesToCsv, fulfillMediaLedger, gateModeFor, generateActivityFlow, generateCodeLabFlow, generateDiagnosticQuizFlow, generateEducationalImage, generateExtensionFlow, generateHandoutFlow, generateLessonMasterFlow, generateMilestoneCurriculumBundle, generatePhase1SotArtifacts, generatePhase2SotArtifacts, generateProjectInstruction, generateProjectInstructionFlow, generateRoadmapCurriculum, generateSelfLabFlow, generateSelfPacedBundle, generateSingleArtifact, generateSlidesFlow, generateTeacherGuideFlow, generateWorksheetFlow, getAIModel, getArtifactMetadata, getDesignatedFallbackChain, getDesignatedFallbackConfig, getLessonMetadata, getProjectArtifactScope, getProjectStatusReport, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isActivityAlignmentLogOnly, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadAuthoringTemplate, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, packUnitSessions, packagerTools, parseAllSessions, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, reconcilePlanDepth, renderAssignedRowsTable, renderEntitySlotsForType, renderFrameworkFromPlan, renderHorizonPromptBlock, renderMediaPlaceholder, researcherTools, resolveApiKey, resolveArtifactTemplate, resolveGateSettings, resolveStandardsPacks, resolveStreamBudget, resolveTargetLanguageCode, resolveTranslationTargets, reviewerTools, runCurriculumAIInference, safeParseJson, searchEducationalImages, searchEducationalVideos, selectStatementsForLesson, serializeActivityToMarkdown, serializeCodeLabToMarkdown, serializeDiagnosticQuizToMarkdown, serializeHandoutToMarkdown, serializeLessonToMarkdown, serializeProjectInstructionToMarkdown, serializeSelfLabToMarkdown, slugifyProjectName, streamCurriculumAIInference, streamCurriculumAIInferenceWithTools, streamDiagnosticQuizFlow, streamLLMWithFallback, streamLayerPrefillWithFallback, streamLessonMasterFlow, streamSelfLabFlow, stripHeadingKey, stripLlmJsonWrappers, stripTemplateFrontmatter, targetLanguageDisplayName, techSmeTools, topoSort, translateTemplate, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateHorizonCompliance, validateHybridDeckSlides, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
31518
31741
  //# sourceMappingURL=index.mjs.map
31519
31742
  //# sourceMappingURL=index.mjs.map