@thanh01.pmt/curriculum-kit 1.4.1 → 1.4.2

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
@@ -1301,7 +1301,9 @@ var LessonPlanSchema = z.object({
1301
1301
  name: z.string().optional().default(""),
1302
1302
  description: z.string(),
1303
1303
  bloomLevel: z.string().default("understand"),
1304
- successCriteria: z.string().optional().default("")
1304
+ successCriteria: z.string().optional().default(""),
1305
+ standardRefs: z.array(z.string()).optional(),
1306
+ conceptRefs: z.array(z.string()).optional()
1305
1307
  })).default([]),
1306
1308
  prerequisites: z.string().optional().default(""),
1307
1309
  materialsSummary: z.string().optional().default(""),
@@ -9816,7 +9818,6 @@ var DEFAULT_KX_PRIORITIES = [
9816
9818
  ];
9817
9819
  function buildSectionAwareExcerpt(markdown, opts = {}) {
9818
9820
  const budget = opts.budget ?? 12e3;
9819
- const minContentChars = opts.minContentChars ?? 400;
9820
9821
  const issues = [];
9821
9822
  const source = (markdown || "").trim();
9822
9823
  if (!source) {
@@ -9829,6 +9830,7 @@ function buildSectionAwareExcerpt(markdown, opts = {}) {
9829
9830
  tokenEstimate: 0
9830
9831
  };
9831
9832
  }
9833
+ const minContentChars = opts.minContentChars !== void 0 ? opts.minContentChars : Math.min(400, source.length);
9832
9834
  const slcMap = normalizeSlcContract(opts.sectionLanguageContract);
9833
9835
  const effectiveArtifactType = opts.artifactType || deriveArtifactTypeFromFileName(opts.fileName);
9834
9836
  const sections = parseMarkdownSections(source, slcMap, effectiveArtifactType);
@@ -9848,44 +9850,74 @@ function buildSectionAwareExcerpt(markdown, opts = {}) {
9848
9850
  };
9849
9851
  }
9850
9852
  const byCanonical = /* @__PURE__ */ new Map();
9853
+ const byCleanTitle = /* @__PURE__ */ new Map();
9851
9854
  const unmatched = [];
9852
9855
  for (const s of sections) {
9853
9856
  if (s.canonicalKey && !byCanonical.has(s.canonicalKey)) {
9854
9857
  byCanonical.set(s.canonicalKey, s);
9855
- } else {
9858
+ }
9859
+ const norm = normalizeHeading(s.cleanTitle);
9860
+ if (!byCleanTitle.has(norm)) {
9861
+ byCleanTitle.set(norm, s);
9862
+ }
9863
+ if (!s.canonicalKey) {
9856
9864
  unmatched.push(s);
9857
9865
  }
9858
9866
  }
9859
9867
  const priorities = opts.priorities ?? DEFAULT_LESSON_PRIORITIES;
9860
9868
  const includedSections = [];
9861
9869
  const blocks = [];
9862
- let used = 0;
9870
+ const initialOverhead = metaBlock ? metaBlock.length + 2 : 0;
9871
+ let used = initialOverhead;
9863
9872
  const tryAdd = (heading, body, key) => {
9864
9873
  const trimmedBody = body.trim();
9865
9874
  if (!trimmedBody) return false;
9866
9875
  const block = `## ${heading}
9867
9876
 
9868
9877
  ${trimmedBody}`;
9869
- if (used + block.length > budget && used > 0) return false;
9870
- blocks.push(block);
9871
- used += block.length;
9872
- includedSections.push(key);
9873
- return true;
9878
+ if (used + block.length <= budget) {
9879
+ blocks.push(block);
9880
+ used += block.length;
9881
+ includedSections.push(key);
9882
+ return true;
9883
+ }
9884
+ if (includedSections.length === 0 && budget >= minContentChars) {
9885
+ const headingOverhead = `## ${heading}
9886
+
9887
+ `.length;
9888
+ const remaining = budget - used;
9889
+ if (remaining > headingOverhead + 50) {
9890
+ const allowedBody = remaining - headingOverhead;
9891
+ const truncated = truncateByBudget(trimmedBody, allowedBody).trim();
9892
+ if (truncated.length > 0) {
9893
+ const partialBlock = `## ${heading}
9894
+
9895
+ ${truncated}`;
9896
+ blocks.push(partialBlock);
9897
+ used += partialBlock.length;
9898
+ includedSections.push(key);
9899
+ issues.push(`section:truncated:${key}`);
9900
+ return true;
9901
+ }
9902
+ }
9903
+ }
9904
+ return false;
9874
9905
  };
9875
9906
  blocks.push(metaBlock);
9876
9907
  let sectionAware = false;
9877
9908
  for (const key of priorities) {
9878
- const sec = byCanonical.get(key);
9909
+ const sec = byCanonical.get(key) || byCleanTitle.get(normalizeHeading(key));
9879
9910
  if (!sec) continue;
9880
9911
  sectionAware = true;
9881
9912
  if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
9882
9913
  }
9883
9914
  for (const [key, sec] of byCanonical) {
9884
- if (includedSections.includes(key)) continue;
9915
+ if (includedSections.includes(key) || includedSections.includes(sec.cleanTitle)) continue;
9885
9916
  if (used >= budget) break;
9886
9917
  if (!tryAdd(sec.cleanTitle, sec.body, key)) break;
9887
9918
  }
9888
9919
  for (const sec of unmatched) {
9920
+ if (includedSections.includes(sec.cleanTitle)) continue;
9889
9921
  if (used >= budget) break;
9890
9922
  if (!tryAdd(sec.cleanTitle, sec.body, sec.cleanTitle)) break;
9891
9923
  }
@@ -9893,17 +9925,16 @@ ${trimmedBody}`;
9893
9925
  issues.push("parse:no-canonical-resolution");
9894
9926
  }
9895
9927
  if (priorities.length > 0 && !priorities.some((k) => includedSections.includes(k))) {
9896
- issues.push("parse:no-priority-resolution");
9928
+ issues.push(sections.length === 0 ? "parse:no-sections" : "parse:no-priority-resolution");
9897
9929
  }
9898
9930
  let excerpt = blocks.join("\n\n");
9899
9931
  if (excerpt.length > budget) {
9900
9932
  excerpt = truncateByBudget(excerpt, budget);
9901
9933
  }
9902
- const effectiveMinChars = Math.min(minContentChars, source.length);
9903
- if (excerpt.length - metaBlock.length < effectiveMinChars) {
9934
+ if (excerpt.length - metaBlock.length < minContentChars) {
9904
9935
  issues.push("content:insufficient");
9905
9936
  }
9906
- const verified = !issues.includes("parse:no-priority-resolution") && !issues.includes("parse:no-canonical-resolution") && excerpt.length - metaBlock.length >= effectiveMinChars;
9937
+ const verified = !issues.includes("parse:no-priority-resolution") && !issues.includes("parse:no-canonical-resolution") && excerpt.length - metaBlock.length >= minContentChars;
9907
9938
  return {
9908
9939
  excerpt,
9909
9940
  verified,
@@ -9963,7 +9994,7 @@ function parseMarkdownSections(markdown, slcMap, artifactType) {
9963
9994
  }
9964
9995
  }
9965
9996
  const flush = () => {
9966
- if (!currentHeading && currentBody.length === 0) return;
9997
+ if (!currentHeading) return;
9967
9998
  const cleanTitle = currentHeading.replace(/^#{1,4}\s+/, "").trim();
9968
9999
  const norm = normalizeHeading(cleanTitle);
9969
10000
  const canonicalKey = reverseMap.get(norm) || findCanonicalFuzzy(norm);
@@ -10946,6 +10977,120 @@ function buildStandardsContext(input) {
10946
10977
  const selected = selectStatementsForLesson(input);
10947
10978
  return { block: buildStandardsContextBlock(selected, { language: input.language }), selected };
10948
10979
  }
10980
+
10981
+ // src/standards/standardsCoverageGate.ts
10982
+ function resolveStatementRef(ref, packs) {
10983
+ const [head, ...rest] = ref.split(":");
10984
+ const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;
10985
+ const statementId = rest.length > 0 ? rest.join(":") : ref;
10986
+ for (const p of candidatePacks) {
10987
+ if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };
10988
+ }
10989
+ return null;
10990
+ }
10991
+ function evaluateStandardsCoverage(input) {
10992
+ const rows = [];
10993
+ const aoToLo = /* @__PURE__ */ new Map();
10994
+ for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);
10995
+ const loToRefs = /* @__PURE__ */ new Map();
10996
+ for (const lo of input.objectives) {
10997
+ loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));
10998
+ }
10999
+ const taughtLOs = /* @__PURE__ */ new Set();
11000
+ for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);
11001
+ const assessedLOs = /* @__PURE__ */ new Set();
11002
+ for (const q of input.quizQuestions) {
11003
+ if (q.alignedLO) assessedLOs.add(q.alignedLO);
11004
+ if (q.alignedAO) {
11005
+ const lo = aoToLo.get(q.alignedAO);
11006
+ if (lo) assessedLOs.add(lo);
11007
+ }
11008
+ }
11009
+ for (const pack of input.packs) {
11010
+ const mappingByStatement = /* @__PURE__ */ new Map();
11011
+ for (const m of pack.mappings ?? []) {
11012
+ const prev = mappingByStatement.get(m.statementId);
11013
+ if (!prev || prev !== "covers" && m.kind === "covers" || prev === "extends" && m.kind !== "extends") {
11014
+ mappingByStatement.set(m.statementId, m.kind);
11015
+ }
11016
+ }
11017
+ for (const statement of pack.statements) {
11018
+ const refFull = `${pack.manifest.id}:${statement.id}`;
11019
+ const issues = [];
11020
+ const los = input.objectives.filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull)).map((lo) => lo.code);
11021
+ const kind = mappingByStatement.get(statement.id);
11022
+ const hasMapping = kind !== void 0;
11023
+ const isComplianceRelevant = kind === "covers";
11024
+ const hasActivity = los.some((lo) => taughtLOs.has(lo));
11025
+ const hasAssessment = los.some((lo) => assessedLOs.has(lo));
11026
+ let status;
11027
+ if (!hasMapping) status = "UNMAPPED";
11028
+ else if (!isComplianceRelevant) status = "PARTIAL";
11029
+ else if (los.length > 0 && hasActivity && hasAssessment) status = "COVERED";
11030
+ else status = "UNCOVERED";
11031
+ if (status === "UNCOVERED") {
11032
+ if (los.length === 0) issues.push("No learning objective anchors this statement (missing standardRefs).");
11033
+ else {
11034
+ if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(", ")} have no activity in lesson flow.`);
11035
+ if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(", ")} are not measured by any quiz question.`);
11036
+ }
11037
+ }
11038
+ rows.push({
11039
+ packId: pack.manifest.id,
11040
+ statementId: statement.id,
11041
+ statementText: Object.values(statement.texts)[0] ?? "",
11042
+ status,
11043
+ objectives: los,
11044
+ hasActivity,
11045
+ hasAssessment,
11046
+ issues
11047
+ });
11048
+ }
11049
+ }
11050
+ for (const lo of input.objectives) {
11051
+ for (const r of lo.standardRefs ?? []) {
11052
+ if (!resolveStatementRef(r, input.packs)) {
11053
+ rows.push({
11054
+ packId: "(unresolved)",
11055
+ statementId: r,
11056
+ statementText: "",
11057
+ status: "UNCOVERED",
11058
+ objectives: [lo.code],
11059
+ hasActivity: false,
11060
+ hasAssessment: false,
11061
+ issues: [`standardRef "${r}" does not exist in any adopted pack \u2014 likely a hallucinated or stale ID`]
11062
+ });
11063
+ }
11064
+ }
11065
+ }
11066
+ const complianceRows = rows.filter((r) => r.status !== "UNMAPPED" && r.status !== "PARTIAL");
11067
+ const covered = complianceRows.filter((r) => r.status === "COVERED").length;
11068
+ const coveragePct = complianceRows.length === 0 ? 100 : Math.round(covered / complianceRows.length * 100);
11069
+ const unresolvedCount = rows.filter((r) => r.packId === "(unresolved)").length;
11070
+ const verdict = unresolvedCount > 0 || coveragePct < 60 ? "FAIL" : coveragePct < 100 ? "WARN" : "PASS";
11071
+ const lines = [
11072
+ "# Standards Coverage Report",
11073
+ "",
11074
+ `- Verdict: **${verdict}**`,
11075
+ `- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} "covers" statements fully taught + assessed)`,
11076
+ `- Unresolved standardRefs: ${unresolvedCount}`,
11077
+ "",
11078
+ "| Pack | Statement | Status | LOs | Activity | Assessment |",
11079
+ "|---|---|---|---|---|---|",
11080
+ ...rows.map(
11081
+ (r) => `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(", ") || "\u2014"}|${r.hasActivity ? "\u2713" : "\u2717"}|${r.hasAssessment ? "\u2713" : "\u2717"}|`
11082
+ )
11083
+ ];
11084
+ const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));
11085
+ if (issueLines.length > 0) lines.push("", "## Issues", ...issueLines);
11086
+ return {
11087
+ verdict,
11088
+ coveragePct,
11089
+ rows,
11090
+ summary: `Standards coverage ${coveragePct}% \u2014 verdict ${verdict}`,
11091
+ rawMarkdownReport: lines.join("\n")
11092
+ };
11093
+ }
10949
11094
  var BloomHintSchema = z.object({
10950
11095
  process: z.enum(["Remember", "Understand", "Apply", "Analyze", "Evaluate", "Create"]).describe("Cognitive process axis"),
10951
11096
  knowledge: z.enum(["FACTUAL", "CONCEPTUAL", "PROCEDURAL", "METACOGNITIVE"]).optional().describe("Knowledge dimension axis (optional \u2014 most source standards do not tag it)")
@@ -11381,9 +11526,170 @@ var csta_k12_2017_default = {
11381
11526
  ]
11382
11527
  };
11383
11528
 
11529
+ // src/standards/data/acm-ieee-cs2023.json
11530
+ var acm_ieee_cs2023_default = {
11531
+ manifest: {
11532
+ id: "acm-ieee-cs2023",
11533
+ name: "ACM/IEEE-CS/AAAI Computer Science Curricula 2023 (CS2023)",
11534
+ specVersion: "1.0",
11535
+ contentVersion: "2023.1",
11536
+ subject: "computing",
11537
+ languages: ["en"],
11538
+ gradeModel: {
11539
+ type: "grades",
11540
+ range: [9, 16]
11541
+ },
11542
+ provenance: {
11543
+ sourceRef: "ACM/IEEE-CS/AAAI Computer Science Curricula 2023 - cs2023.org",
11544
+ sourceUrl: "https://cs2023.org",
11545
+ license: "ACM / IEEE Computer Society (cited verbatim for curriculum alignment)",
11546
+ importedBy: "platform",
11547
+ importedAt: "2026-09-11T00:00:00.000Z"
11548
+ },
11549
+ trust: "verified"
11550
+ },
11551
+ statements: [
11552
+ {
11553
+ id: "CS2023-SDF-01",
11554
+ gradeBand: [9, 14],
11555
+ texts: {
11556
+ en: "Design, implement, test, and debug programs using basic computation, standard conditional and iterative structures, and functions."
11557
+ },
11558
+ classifications: [
11559
+ { axis: "Knowledge Area", value: "Software Development Fundamentals (SDF)" },
11560
+ { axis: "Core Tier", value: "Tier-1 Core" }
11561
+ ],
11562
+ bloomHint: { process: "Apply" },
11563
+ keywords: ["algorithms", "control structures", "functions", "variables", "debugging", "programming", "implementation"],
11564
+ sourceRef: "CS2023, Software Development Fundamentals, Program Construction",
11565
+ provenance: { method: "source_official" }
11566
+ },
11567
+ {
11568
+ id: "CS2023-SDF-02",
11569
+ gradeBand: [9, 14],
11570
+ texts: {
11571
+ en: "Apply fundamental data structures (arrays, lists, stacks, queues, hash maps) to represent collections of data and solve algorithmic problems."
11572
+ },
11573
+ classifications: [
11574
+ { axis: "Knowledge Area", value: "Software Development Fundamentals (SDF)" },
11575
+ { axis: "Core Tier", value: "Tier-1 Core" }
11576
+ ],
11577
+ bloomHint: { process: "Apply" },
11578
+ keywords: ["data structures", "arrays", "lists", "hash maps", "collections", "stacks", "queues"],
11579
+ sourceRef: "CS2023, Software Development Fundamentals, Fundamental Data Structures",
11580
+ provenance: { method: "source_official" }
11581
+ },
11582
+ {
11583
+ id: "CS2023-AL-01",
11584
+ gradeBand: [10, 16],
11585
+ texts: {
11586
+ en: "Analyze and compare the time and space complexity of fundamental algorithms using asymptotic notation (Big-O)."
11587
+ },
11588
+ classifications: [
11589
+ { axis: "Knowledge Area", value: "Algorithms and Complexity (AL)" },
11590
+ { axis: "Core Tier", value: "Tier-1 Core" }
11591
+ ],
11592
+ bloomHint: { process: "Analyze" },
11593
+ keywords: ["complexity", "big-o", "efficiency", "sorting", "searching", "asymptotic", "runtime"],
11594
+ sourceRef: "CS2023, Algorithms and Complexity, Basic Analysis",
11595
+ provenance: { method: "source_official" }
11596
+ },
11597
+ {
11598
+ id: "CS2023-SE-01",
11599
+ gradeBand: [9, 16],
11600
+ texts: {
11601
+ en: "Decompose complex problems into modular software components applying principles of abstraction, encapsulation, and separation of concerns."
11602
+ },
11603
+ classifications: [
11604
+ { axis: "Knowledge Area", value: "Software Engineering (SE)" },
11605
+ { axis: "Core Tier", value: "Tier-1 Core" }
11606
+ ],
11607
+ bloomHint: { process: "Create" },
11608
+ keywords: ["modularity", "abstraction", "software design", "refactoring", "encapsulation", "architecture"],
11609
+ sourceRef: "CS2023, Software Engineering, Software Design and Architecture",
11610
+ provenance: { method: "source_official" }
11611
+ },
11612
+ {
11613
+ id: "CS2023-SEC-01",
11614
+ gradeBand: [9, 16],
11615
+ texts: {
11616
+ en: "Incorporate defensive programming and fundamental cybersecurity principles (least privilege, input validation, secure data handling) into software development."
11617
+ },
11618
+ classifications: [
11619
+ { axis: "Knowledge Area", value: "Security (SEC)" },
11620
+ { axis: "Core Tier", value: "Tier-1 Core" }
11621
+ ],
11622
+ bloomHint: { process: "Apply" },
11623
+ keywords: ["security", "defensive programming", "input validation", "cybersecurity", "vulnerabilities"],
11624
+ sourceRef: "CS2023, Security, Secure Software Development",
11625
+ provenance: { method: "source_official" }
11626
+ },
11627
+ {
11628
+ id: "CS2023-AI-01",
11629
+ gradeBand: [10, 16],
11630
+ texts: {
11631
+ en: "Formulate machine learning tasks, prepare training and evaluation datasets, and evaluate model performance using standard metrics."
11632
+ },
11633
+ classifications: [
11634
+ { axis: "Knowledge Area", value: "Artificial Intelligence (AI)" },
11635
+ { axis: "Core Tier", value: "Tier-2 Core" }
11636
+ ],
11637
+ bloomHint: { process: "Evaluate" },
11638
+ keywords: ["artificial intelligence", "machine learning", "dataset", "evaluation", "model", "accuracy"],
11639
+ sourceRef: "CS2023, Artificial Intelligence, Machine Learning Fundamentals",
11640
+ provenance: { method: "source_official" }
11641
+ }
11642
+ ],
11643
+ mappings: [
11644
+ {
11645
+ statementId: "CS2023-SDF-01",
11646
+ targetRef: "ontora:PROGRAM_CONSTRUCTION",
11647
+ kind: "covers",
11648
+ confidence: 0.95,
11649
+ provenance: { method: "source_official" }
11650
+ },
11651
+ {
11652
+ statementId: "CS2023-SDF-02",
11653
+ targetRef: "ontora:DATA_STRUCTURES",
11654
+ kind: "covers",
11655
+ confidence: 0.95,
11656
+ provenance: { method: "source_official" }
11657
+ },
11658
+ {
11659
+ statementId: "CS2023-AL-01",
11660
+ targetRef: "ontora:ALGORITHM_COMPLEXITY",
11661
+ kind: "covers",
11662
+ confidence: 0.95,
11663
+ provenance: { method: "source_official" }
11664
+ },
11665
+ {
11666
+ statementId: "CS2023-SE-01",
11667
+ targetRef: "ontora:SOFTWARE_ARCHITECTURE",
11668
+ kind: "covers",
11669
+ confidence: 0.95,
11670
+ provenance: { method: "source_official" }
11671
+ },
11672
+ {
11673
+ statementId: "CS2023-SEC-01",
11674
+ targetRef: "ontora:DEFENSIVE_PROGRAMMING",
11675
+ kind: "covers",
11676
+ confidence: 0.95,
11677
+ provenance: { method: "source_official" }
11678
+ },
11679
+ {
11680
+ statementId: "CS2023-AI-01",
11681
+ targetRef: "ontora:MACHINE_LEARNING",
11682
+ kind: "covers",
11683
+ confidence: 0.95,
11684
+ provenance: { method: "source_official" }
11685
+ }
11686
+ ]
11687
+ };
11688
+
11384
11689
  // src/standards/bundledPacks.ts
11385
11690
  var BUNDLED_PACK_RECORDS = {
11386
- "csta-k12-2017": csta_k12_2017_default
11691
+ "csta-k12-2017": csta_k12_2017_default,
11692
+ "acm-ieee-cs2023": acm_ieee_cs2023_default
11387
11693
  };
11388
11694
  var BUNDLED_STANDARDS_PACK_IDS = Object.keys(BUNDLED_PACK_RECORDS).sort();
11389
11695
  var parsedPackCache = /* @__PURE__ */ new Map();
@@ -11410,6 +11716,36 @@ function resolveStandardsPacks(packIds) {
11410
11716
  }
11411
11717
  return packs;
11412
11718
  }
11719
+ function findStandardStatement(statementIdOrRef) {
11720
+ if (!statementIdOrRef) return null;
11721
+ const [packPrefix, ...rest] = statementIdOrRef.split(":");
11722
+ const targetId = rest.length > 0 ? rest.join(":") : statementIdOrRef;
11723
+ const packs = resolveStandardsPacks(BUNDLED_STANDARDS_PACK_IDS);
11724
+ for (const pack of packs) {
11725
+ if (rest.length > 0 && pack.manifest.id !== packPrefix) continue;
11726
+ const stmt = pack.statements.find((s) => s.id.toLowerCase() === targetId.toLowerCase());
11727
+ if (stmt) {
11728
+ const description = stmt.texts["en"] || Object.values(stmt.texts)[0] || "";
11729
+ const category = stmt.classifications && stmt.classifications.length > 0 ? stmt.classifications.map((c) => c.value).join(", ") : void 0;
11730
+ const gradeBand = Array.isArray(stmt.gradeBand) ? stmt.gradeBand[0] === stmt.gradeBand[1] ? String(stmt.gradeBand[0]) : `${stmt.gradeBand[0]}-${stmt.gradeBand[1]}` : void 0;
11731
+ return {
11732
+ packId: pack.manifest.id,
11733
+ packTitle: pack.manifest.name,
11734
+ statementId: stmt.id,
11735
+ description,
11736
+ category,
11737
+ gradeBand
11738
+ };
11739
+ }
11740
+ }
11741
+ return null;
11742
+ }
11743
+ var STANDARD_REF_REGEX = /\b(?:(?:csta-k12-2017|acm-ieee-cs2023):)?(?:[1-3][A-B]?-[A-Z]{2}-\d{2}|CS2023-[A-Z0-9_-]+)\b/gi;
11744
+ function extractStandardRefs(text) {
11745
+ if (!text) return [];
11746
+ const matches = Array.from(text.matchAll(STANDARD_REF_REGEX)).map((m) => m[0]);
11747
+ return Array.from(new Set(matches));
11748
+ }
11413
11749
 
11414
11750
  // src/services/languageDirective.ts
11415
11751
  function resolveTargetLanguageCode(language) {
@@ -11721,7 +12057,7 @@ type: "LESSON_EDP"
11721
12057
  - **Estimated Duration:** 90 minutes
11722
12058
  - **Project Objective:** [Complete engineering system or functional deliverable students build]
11723
12059
  - **Materials & Equipment:** [Detailed hardware, software libraries, and workstation tools]
11724
- - **Learning Objectives Table:** (LO1, LO2 mapped with EDP Bloom level, Student Evidence, and Success Criteria)
12060
+ - **Learning Objectives Table:** (LO1, LO2 mapped with EDP Bloom level, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11725
12061
 
11726
12062
  ### 2. Activity Sequence
11727
12063
  > Activity Contract table with columns: Seq, EDP Phase (Ask, Imagine, Plan, Create, Test & Improve, Share & Evaluate), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -11771,7 +12107,7 @@ type: "LESSON_GENERAL"
11771
12107
  - **Estimated Duration:** 90 minutes
11772
12108
  - **Materials & Equipment:** [Tools, IDE, workstations, resources]
11773
12109
  - **Keywords / Core Concepts:** [Core domain terminology]
11774
- - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria)
12110
+ - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11775
12111
 
11776
12112
  ### 2. Activity Sequence
11777
12113
  > Activity Contract table with columns: Seq, Lesson Stage (Warm-up, Core Concepts, Guided Practice, Independent Practice, Wrap-up), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -11819,7 +12155,7 @@ type: "LESSON_5E"
11819
12155
  - **Estimated Duration:** 90 minutes
11820
12156
  - **Materials & Equipment:** [Tools, IDE, hardware/software specifications]
11821
12157
  - **Keywords / Core Concepts:** [Core domain terminology]
11822
- - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria)
12158
+ - **Learning Objectives Table:** (LO1, LO2 with Bloom action verbs, Student Evidence, Success Criteria, and matching Standard ID from [STANDARDS STATEMENTS] if present, e.g. "CSTA: 1B-AP-10" or "CS2023-SDF-01")
11823
12159
 
11824
12160
  ### 2. Activity Sequence
11825
12161
  > Activity Contract table with columns: Seq, 5E Phase (Engage, Explore, Explain, Elaborate, Evaluate), Activity Type, Actor, Purpose, Student Action, Teacher Move, Output/Evidence, LO, Time, Artifact Contract.
@@ -13039,13 +13375,52 @@ ${buildHeadingDirective("EXT", slcMarkdown, targetLang)}`;
13039
13375
  });
13040
13376
  }
13041
13377
  }
13378
+ let standardsCoverage;
13379
+ if (packs.length > 0 && lessonContent) {
13380
+ try {
13381
+ const objectives = parseLessonObjectivesWithStandards(lessonContent, concept, bloomLevel, packs);
13382
+ const activities = parseActivitySequenceLo(lessonContent);
13383
+ const quizContent = await storage.readArtifact(projectId, quizRelPath).catch(() => null);
13384
+ const quizQuestions = quizContent ? parseQuizQuestionsLo(quizContent) : [];
13385
+ const selected = selectStatementsForLesson({
13386
+ packs,
13387
+ gradeBand: options.gradeBand ?? [6, 12],
13388
+ topicText: `${lessonTitle} ${concept}`
13389
+ });
13390
+ const targetStatementIds = new Set(selected.map((s) => s.statement.id.toLowerCase()));
13391
+ for (const lo of objectives) {
13392
+ for (const r of lo.standardRefs || []) {
13393
+ targetStatementIds.add(r.replace(/^[^:]+:/, "").toLowerCase());
13394
+ }
13395
+ }
13396
+ const scopedPacks = packs.map((p) => ({
13397
+ ...p,
13398
+ statements: p.statements.filter((s) => targetStatementIds.has(s.id.toLowerCase()))
13399
+ })).filter((p) => p.statements.length > 0);
13400
+ if (scopedPacks.length > 0) {
13401
+ standardsCoverage = evaluateStandardsCoverage({
13402
+ packs: scopedPacks,
13403
+ objectives,
13404
+ activities,
13405
+ quizQuestions
13406
+ });
13407
+ onProgress?.(
13408
+ "@reviewer",
13409
+ `\u{1F4CA} Standards Coverage Gate: ${standardsCoverage.verdict} (${standardsCoverage.coveragePct}% coverage, ${standardsCoverage.rows.filter((r) => r.status === "COVERED").length}/${standardsCoverage.rows.length} statements covered)`
13410
+ );
13411
+ }
13412
+ } catch (covErr) {
13413
+ console.warn("[lessonProductionService] Failed to evaluate standards coverage:", covErr?.message || covErr);
13414
+ }
13415
+ }
13042
13416
  return {
13043
13417
  lessonId: lessonCode,
13044
13418
  pedagogy,
13045
13419
  producedArtifacts,
13046
13420
  pausedForReview: false,
13047
13421
  contextInjection: lessonInjection && lessonInjection.verified ? expositionInjection || lessonInjection : lessonInjection || expositionInjection,
13048
- promptChars: commonContext.length
13422
+ promptChars: commonContext.length,
13423
+ standardsCoverage
13049
13424
  };
13050
13425
  }
13051
13426
  function parseLessonObjectives(lessonContent, concept, bloomLevel) {
@@ -13067,6 +13442,65 @@ function parseLessonObjectives(lessonContent, concept, bloomLevel) {
13067
13442
  }
13068
13443
  return objectives.slice(0, 6);
13069
13444
  }
13445
+ function parseLessonObjectivesWithStandards(lessonContent, concept, bloomLevel, _packs) {
13446
+ const baseObjectives = parseLessonObjectives(lessonContent, concept, bloomLevel);
13447
+ const lines = lessonContent.split("\n");
13448
+ return baseObjectives.map((lo) => {
13449
+ const refs = /* @__PURE__ */ new Set();
13450
+ for (const line of lines) {
13451
+ if (line.includes(lo.code)) {
13452
+ const found = extractStandardRefs(line);
13453
+ for (const r of found) refs.add(r);
13454
+ }
13455
+ }
13456
+ return {
13457
+ ...lo,
13458
+ standardRefs: refs.size > 0 ? Array.from(refs) : void 0
13459
+ };
13460
+ });
13461
+ }
13462
+ function parseActivitySequenceLo(lessonContent) {
13463
+ const activities = [];
13464
+ const lines = lessonContent.split("\n");
13465
+ let currentSeq = 1;
13466
+ for (const line of lines) {
13467
+ const matchActivity = line.match(/(?:Hoạt động|Activity|Phase|Giai đoạn)\s*(\d+)/i);
13468
+ const loMatches = Array.from(line.matchAll(/\b(LO\d+)\b/gi)).map((m) => m[1].toUpperCase());
13469
+ if (matchActivity && loMatches.length > 0) {
13470
+ activities.push({
13471
+ seq: parseInt(matchActivity[1], 10),
13472
+ lo: Array.from(new Set(loMatches))
13473
+ });
13474
+ } else if (loMatches.length > 0 && line.trim().startsWith("|")) {
13475
+ activities.push({
13476
+ seq: currentSeq++,
13477
+ lo: Array.from(new Set(loMatches))
13478
+ });
13479
+ }
13480
+ }
13481
+ if (activities.length === 0) {
13482
+ const allLos = Array.from(lessonContent.matchAll(/\b(LO\d+)\b/gi)).map((m) => m[1].toUpperCase());
13483
+ if (allLos.length > 0) {
13484
+ activities.push({ seq: 1, lo: Array.from(new Set(allLos)) });
13485
+ }
13486
+ }
13487
+ return activities;
13488
+ }
13489
+ function parseQuizQuestionsLo(quizContent) {
13490
+ const questions = [];
13491
+ const lines = quizContent.split("\n");
13492
+ for (const line of lines) {
13493
+ const loMatch = line.match(/\b(LO\d+)\b/i);
13494
+ const aoMatch = line.match(/\b(AO\d+)\b/i);
13495
+ if (loMatch || aoMatch) {
13496
+ questions.push({
13497
+ alignedLO: loMatch ? loMatch[1].toUpperCase() : void 0,
13498
+ alignedAO: aoMatch ? aoMatch[1].toUpperCase() : void 0
13499
+ });
13500
+ }
13501
+ }
13502
+ return questions;
13503
+ }
13070
13504
  async function judgeSatelliteArtifact(ctx) {
13071
13505
  const { storage, projectId, lessonCode, sat, content } = ctx;
13072
13506
  try {
@@ -16791,120 +17225,6 @@ var MisconceptionEvaluator = class {
16791
17225
  };
16792
17226
  }
16793
17227
  };
16794
-
16795
- // src/standards/standardsCoverageGate.ts
16796
- function resolveStatementRef(ref, packs) {
16797
- const [head, ...rest] = ref.split(":");
16798
- const candidatePacks = rest.length > 0 ? packs.filter((p) => p.manifest.id === head) : packs;
16799
- const statementId = rest.length > 0 ? rest.join(":") : ref;
16800
- for (const p of candidatePacks) {
16801
- if (p.statements.some((s) => s.id === statementId)) return { pack: p, statementId };
16802
- }
16803
- return null;
16804
- }
16805
- function evaluateStandardsCoverage(input) {
16806
- const rows = [];
16807
- const aoToLo = /* @__PURE__ */ new Map();
16808
- for (const ao of input.assessmentObjectives ?? []) aoToLo.set(ao.aoCode, ao.alignedLO);
16809
- const loToRefs = /* @__PURE__ */ new Map();
16810
- for (const lo of input.objectives) {
16811
- loToRefs.set(lo.code, new Set(lo.standardRefs ?? []));
16812
- }
16813
- const taughtLOs = /* @__PURE__ */ new Set();
16814
- for (const act of input.activities ?? []) for (const lo of act.lo) taughtLOs.add(lo);
16815
- const assessedLOs = /* @__PURE__ */ new Set();
16816
- for (const q of input.quizQuestions) {
16817
- if (q.alignedLO) assessedLOs.add(q.alignedLO);
16818
- if (q.alignedAO) {
16819
- const lo = aoToLo.get(q.alignedAO);
16820
- if (lo) assessedLOs.add(lo);
16821
- }
16822
- }
16823
- for (const pack of input.packs) {
16824
- const mappingByStatement = /* @__PURE__ */ new Map();
16825
- for (const m of pack.mappings ?? []) {
16826
- const prev = mappingByStatement.get(m.statementId);
16827
- if (!prev || prev !== "covers" && m.kind === "covers" || prev === "extends" && m.kind !== "extends") {
16828
- mappingByStatement.set(m.statementId, m.kind);
16829
- }
16830
- }
16831
- for (const statement of pack.statements) {
16832
- const refFull = `${pack.manifest.id}:${statement.id}`;
16833
- const issues = [];
16834
- const los = input.objectives.filter((lo) => (lo.standardRefs ?? []).some((r) => r === statement.id || r === refFull)).map((lo) => lo.code);
16835
- const kind = mappingByStatement.get(statement.id);
16836
- const hasMapping = kind !== void 0;
16837
- const isComplianceRelevant = kind === "covers";
16838
- const hasActivity = los.some((lo) => taughtLOs.has(lo));
16839
- const hasAssessment = los.some((lo) => assessedLOs.has(lo));
16840
- let status;
16841
- if (!hasMapping) status = "UNMAPPED";
16842
- else if (!isComplianceRelevant) status = "PARTIAL";
16843
- else if (los.length > 0 && hasActivity && hasAssessment) status = "COVERED";
16844
- else status = "UNCOVERED";
16845
- if (status === "UNCOVERED") {
16846
- if (los.length === 0) issues.push("No learning objective anchors this statement (missing standardRefs).");
16847
- else {
16848
- if (!hasActivity) issues.push(`Anchored LO(s) ${los.join(", ")} have no activity in lesson flow.`);
16849
- if (!hasAssessment) issues.push(`Anchored LO(s) ${los.join(", ")} are not measured by any quiz question.`);
16850
- }
16851
- }
16852
- rows.push({
16853
- packId: pack.manifest.id,
16854
- statementId: statement.id,
16855
- statementText: Object.values(statement.texts)[0] ?? "",
16856
- status,
16857
- objectives: los,
16858
- hasActivity,
16859
- hasAssessment,
16860
- issues
16861
- });
16862
- }
16863
- }
16864
- for (const lo of input.objectives) {
16865
- for (const r of lo.standardRefs ?? []) {
16866
- if (!resolveStatementRef(r, input.packs)) {
16867
- rows.push({
16868
- packId: "(unresolved)",
16869
- statementId: r,
16870
- statementText: "",
16871
- status: "UNCOVERED",
16872
- objectives: [lo.code],
16873
- hasActivity: false,
16874
- hasAssessment: false,
16875
- issues: [`standardRef "${r}" does not exist in any adopted pack \u2014 likely a hallucinated or stale ID`]
16876
- });
16877
- }
16878
- }
16879
- }
16880
- const complianceRows = rows.filter((r) => r.status !== "UNMAPPED" && r.status !== "PARTIAL");
16881
- const covered = complianceRows.filter((r) => r.status === "COVERED").length;
16882
- const coveragePct = complianceRows.length === 0 ? 100 : Math.round(covered / complianceRows.length * 100);
16883
- const unresolvedCount = rows.filter((r) => r.packId === "(unresolved)").length;
16884
- const verdict = unresolvedCount > 0 || coveragePct < 60 ? "FAIL" : coveragePct < 100 ? "WARN" : "PASS";
16885
- const lines = [
16886
- "# Standards Coverage Report",
16887
- "",
16888
- `- Verdict: **${verdict}**`,
16889
- `- Compliance coverage: **${coveragePct}%** (${covered}/${complianceRows.length} "covers" statements fully taught + assessed)`,
16890
- `- Unresolved standardRefs: ${unresolvedCount}`,
16891
- "",
16892
- "| Pack | Statement | Status | LOs | Activity | Assessment |",
16893
- "|---|---|---|---|---|---|",
16894
- ...rows.map(
16895
- (r) => `|${r.packId}|${r.statementId}|${r.status}|${r.objectives.join(", ") || "\u2014"}|${r.hasActivity ? "\u2713" : "\u2717"}|${r.hasAssessment ? "\u2713" : "\u2717"}|`
16896
- )
16897
- ];
16898
- const issueLines = rows.filter((r) => r.issues.length > 0).flatMap((r) => r.issues.map((i) => `- [${r.packId}:${r.statementId}] ${i}`));
16899
- if (issueLines.length > 0) lines.push("", "## Issues", ...issueLines);
16900
- return {
16901
- verdict,
16902
- coveragePct,
16903
- rows,
16904
- summary: `Standards coverage ${coveragePct}% \u2014 verdict ${verdict}`,
16905
- rawMarkdownReport: lines.join("\n")
16906
- };
16907
- }
16908
17228
  var StandardsRegistryAdapter = class {
16909
17229
  client;
16910
17230
  constructor(config = {}) {
@@ -17567,6 +17887,6 @@ function renderMediaPlaceholder(entry) {
17567
17887
  return `> \u{1F5BC}\uFE0F [\u1EA2nh \u0111ang ch\u1EDD: ${entry.name} \u2014 s\u1EBD \u0111\u01B0\u1EE3c t\u1EA1o sau khi duy\u1EC7t media]`;
17568
17888
  }
17569
17889
 
17570
- export { ACT_TEMPLATE, ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BELL_RINGER_TEMPLATE, BLOOM_ACTION_VERBS, BOM_TEMPLATE, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CHOICE_BOARD_TEMPLATE, CODE_LAB_TEMPLATE, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, 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_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, EXIT_TICKET_TEMPLATE, EXPOSITION_REL, EXT_TEMPLATE, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GLOSSARY_TEMPLATE, GRAPHIC_ORGANIZER_TEMPLATE, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HANDOUT_TEMPLATE, HandoutSchema, HandoutSectionSchema, InstructionSectionSchema, InstructionStepSchema, JudgeCriterionSchema, LAYER_TOTAL_BUDGET_MS, LESSON_PLAN_TEMPLATE, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MappingKindSchema, MarpSlideSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PROJECT_INSTRUCTION_TEMPLATE, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QUIZ_TEMPLATE, QualityAuditVerdictSchema, QuizOptionSchema, REVIEW_GAME_TEMPLATE, RUBRIC_TEMPLATE, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SCIENCE_LAB_TEMPLATE, SELF_LAB_TEMPLATE, SLIDE_CANONICAL_METHODOLOGY, SLIDE_LAYOUT_PRESETS, SLIDE_TEMPLATE, STANDARD_SOT_FILES, STATION_ROTATION_TEMPLATE, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SilverTierSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TASK_CARDS_TEMPLATE, TEACHER_GUIDE_TEMPLATE, TIERED_PRACTICE_TEMPLATE, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WORKSHEET_TEMPLATE, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, activityTools, analystTools, analyzeProjectCreationIntent, assertAcyclic, assessorTools, auditCurriculumQualityFlow, auditQualityReport, buildActivityPrompt, buildCodeLabPrompt, buildCurriculumContext, buildCurriculumPlan, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildProjectInstructionPrompt, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWorksheetPrompt, closeTruncatedJson, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, ensureExpositionForLesson, ensureKnowledgeExposition, evaluateStandardsCoverage, executeCurriculumCommand, exportAllProjectQuizzes, expositionCacheKey, extractScopeSequenceRows, extractSectionHeadingsFromSLC, extractSessionSlice, extractStreamChunk, extractThoughtAndContent, 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, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, normalizeSlcContract, packagerTools, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, renderFrameworkFromPlan, renderMediaPlaceholder, researcherTools, 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, stripLlmJsonWrappers, targetLanguageDisplayName, techSmeTools, topoSort, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
17890
+ export { ACT_TEMPLATE, ARTIFACT_DEPENDENCY_ROUTING, ARTIFACT_EXECUTION_ORDER, AcademicAuditor, ActiveLearningWorkflowSchema, ActivityLabSchema, ActivitySeqRowSchema, ActivityStepSchema, ArtifactContractRowSchema, AssessmentMapRowSchema, AssessmentObjectiveSchema, BELL_RINGER_TEMPLATE, BLOOM_ACTION_VERBS, BOM_TEMPLATE, BUNDLED_STANDARDS_PACK_IDS, BellRingerDaySchema, BellRingerSchema, BloomHintSchema, BloomLevelSchema, BloomTaxonomyEvaluator, BronzeTierSchema, CERConclusionSchema, CHOICE_BOARD_TEMPLATE, CODE_LAB_TEMPLATE, CURRICULUM_SLASH_COMMANDS, CardTierEnum, ChoiceBoardRubricRowSchema, ChoiceBoardSchema, ChoiceRuleSchema, ChoiceSquareSchema, ClassificationSchema, CodeHardwareFeasibilityEvaluator, CodeLabSchema, CodeSnippetSchema, CompetencyRubricRowSchema, ComputationalThinkingSchema, 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_STREAM_IDLE_MS, DEFAULT_STREAM_TOTAL_MS, DependencyEdgeSchema, DepthAssignmentSchema, DepthLevelSchema, DeterministicPipelineRunner, DeterministicStructuralLinter, DiagnosticQuestionSchema, DiagnosticQuizSchema, EDPPhaseEnum, EXIT_TICKET_TEMPLATE, EXPOSITION_REL, EXT_TEMPLATE, EntryLevelSchema, ExitTicketBugHuntSchema, ExitTicketMetacognitionSchema, ExitTicketQuickItemSchema, ExitTicketRecallPromptSchema, ExitTicketSchema, ExperimentalDesignSchema, ExpositionApprovalError, ExtensionChallengeSchema, ExtensionSchema, FileSystemCurriculumAdapter, FiveEFlowPhaseSchema, FiveEInstructionalEvaluator, FiveEPhaseEnum, FrameworkMappingSchema, FrameworkPackManifestSchema, FrameworkPackSchema, FrameworkStatementSchema, GLOSSARY_TEMPLATE, GRAPHIC_ORGANIZER_TEMPLATE, GlossaryQuickRefRowSchema, GlossarySchema, GlossaryTermSchema, GoldTierSchema, GradeBandSchema, GraphicOrganizerItemSchema, GraphicOrganizerSchema, HANDOUT_TEMPLATE, HandoutSchema, HandoutSectionSchema, InstructionSectionSchema, InstructionStepSchema, JudgeCriterionSchema, LAYER_TOTAL_BUDGET_MS, LESSON_PLAN_TEMPLATE, LLMJudgeEngine, LabTierTaskSchema, LearningObjectiveInputSchema, LearningObjectiveRowSchema, LessonFlowPhaseSchema, LessonPlan5ESchema, LessonPlanEDPSchema, LessonPlanSchema, LessonSectionSchema, LocalWorkspaceManager, MappingKindSchema, MarpSlideSchema, MediaError, MediaLedger, MentorCheatsheetSchema, MilestoneInputSchema, MisconceptionEvaluator, MisconceptionSchema, ModelPolicyResolver, NVIDIA_MODELS, NodeKindSchema, OrganizerTypeEnum, PROJECT_INSTRUCTION_TEMPLATE, PhaseInputSchema, PlanConstraintsSchema, PlannerInputSchema, PlanningGraphSchema, PlanningNodeSchema, PrerequisiteDecisionEntrySchema, PrerequisiteDecisionSchema, ProductGoalSchema, ProgressiveHintsSchema, ProjectGraphSchema, ProjectInstructionSchema, ProjectProfileSchema, QUIZ_TEMPLATE, QualityAuditVerdictSchema, QuizOptionSchema, REVIEW_GAME_TEMPLATE, RUBRIC_TEMPLATE, RecordProvenanceSchema, ResourceMapRowSchema, ReviewGameExportRowSchema, ReviewGameQuestionSchema, ReviewGameSchema, RoadmapInputSchema, RotationStationSchema, RubricCriteriaSchema, RubricSchema, SCIENCE_LAB_TEMPLATE, SELF_LAB_TEMPLATE, SLIDE_CANONICAL_METHODOLOGY, SLIDE_LAYOUT_PRESETS, SLIDE_TEMPLATE, STANDARD_REF_REGEX, STANDARD_SOT_FILES, STATION_ROTATION_TEMPLATE, ScaffoldDecisionEntrySchema, ScaffoldDecisionSchema, ScienceLabSchema, ScoringRubricRowSchema, SelfLabSchema, SelfPacedBundleSchema, SelfPacedChallengeSchema, SessionPlanSchema, SilverTierSchema, SlideDeckSchema, StandardizedTermRowSchema, StandardsRegistryAdapter, StationRecordRowSchema, StationRotationSchema, StationTypeEnum, SupabaseCurriculumAdapter, TASK_CARDS_TEMPLATE, TEACHER_GUIDE_TEMPLATE, TIERED_PRACTICE_TEMPLATE, TaskCardSchema, TaskCardsSchema, TeacherGuideSchema, TeachingScriptPhaseSchema, TierLevelEnum, TierObjectiveSchema, TieredPracticeSchema, TranslationPolicySchema, TroubleshootingEntrySchema, TroubleshootingRowSchema, UnitPlanSchema, UserJourneySchema, WORKSHEET_TEMPLATE, WorksheetItemSchema, WorksheetItemTypeEnum, WorksheetPartSchema, WorksheetSchema, activityTools, analystTools, analyzeProjectCreationIntent, assertAcyclic, assessorTools, auditCurriculumQualityFlow, auditQualityReport, buildActivityPrompt, buildCodeLabPrompt, buildCurriculumContext, buildCurriculumPlan, buildDeliveryPackages, buildDiagnosticQuizPrompt, buildExpositionContext, buildExpositionExcerpt, buildExtensionPrompt, buildHandoutPrompt, buildHeadingDirective, buildHtmlDeckSlidePrompt, buildImagePrompt, buildJudgePrompt, buildLanguageDirective, buildLessonExcerpt, buildLessonMasterPrompt, buildMarpMarkdownSlidePrompt, buildProjectInstructionPrompt, buildSectionAwareExcerpt, buildSelfLabPrompt, buildSessionSliceContext, buildSlidesPrompt, buildStandardStackMarkdown, buildStandardsContext, buildStandardsContextBlock, buildTeacherGuidePrompt, buildWorksheetPrompt, closeTruncatedJson, computeContentHash, computePackingSpec, conductPreliminaryResearch, contentTools, convertRoadmapToFoundationSot, createAiInferenceError, createContextMissingError, createCurriculumStorage, createIdleAbortController, createStreamAbortController, createStreamAbortSignal, createStreamChunkExtractor, curateMediaLedger, designerTools, detectProjectPedagogy, ensureExpositionForLesson, ensureKnowledgeExposition, evaluateStandardsCoverage, executeCurriculumCommand, exportAllProjectQuizzes, expositionCacheKey, extractScopeSequenceRows, extractSectionHeadingsFromSLC, extractSessionSlice, extractStandardRefs, extractStreamChunk, extractThoughtAndContent, 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, getSlideLayoutPresetById, getSlideLayoutPresetsByCategory, getSmartResumeContext, glossaryTermsForSession, illustratorTools, importRoadmapToProject, ingestProjectGraphIntoProject, initializeProjectInStorage, injectMediaIntoMarkdown, isExpositionFresh, isModelAllowed, isProviderEnabled, isTranslationDue, lintAndSanitizeArtifact, lintCurriculumFramework, lintFrameworkPack, loadCurriculumTemplate, loadSotTemplate, normalizePlanningGraph, normalizeSlcContract, packagerTools, parseGateSettings, parseQuizMarkdown, parseRoadmapJsonToProjectPayload, produceBatchLessons, produceSingleLesson, publishToGitHub, publishToSupabase, rankGenCandidates, renderFrameworkFromPlan, renderMediaPlaceholder, researcherTools, 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, stripLlmJsonWrappers, targetLanguageDisplayName, techSmeTools, topoSort, uploadAssetToBucket, validateArtifactDependencies, validateCurriculumPlan, validateFrameworkPack, validateMarkdownTables, validateMermaidSyntax, withAutoRepair };
17571
17891
  //# sourceMappingURL=index.mjs.map
17572
17892
  //# sourceMappingURL=index.mjs.map